目录:
- finally的使用
- finally面试题
- final、finally、finalize的区别
finally子句的使用:
1、在finally子句中的代码是最后且一定会执行的,即使try语句块中的代码出现异常
2、finally子句必须和try一起出现,不能单独编写
3、finally子句出现的情况如下:
通常finally语句块中完成资源的释放/关闭。
try{ System.out.println("hi"); return; }finally{ System.out.println("finally"); } //注意,try和finally联合使用,没有catch也可以,但try不能单独使用 以上代码执行顺序: 先执行try,后执行finally,最后执行return
注意:return语句只要执行,所在方法必然结束!
try{ System.out.println("hi"); //退出JVM System.exit(0); }finally{ System.out.println("finally"); } //控制台输出:hi 原因:finally只有在退出JVM之后,其代码才不会执行
finally面试题:
判断下面程序输出的结果为多少?
public static void main(String[] args){ int result = m(); System.out.println(result); } public static int m(){ int i = 100; try{ return i; }finally{ i++; } }
答案:100
原因:
存在一些Java语法规则,方法体中的代码必须遵循自上而下的顺序依次执行;return语句一旦执行,整个方法必须结束。
在以上程序中执行完int i=100之后,代码执行就到了return i;此时为return 100;此语句搁置,先执行finally,最后执行return 100;
具体执行过程可以看代码反编译之后的结果
//上述代码反编译之后的结果 public static int m(){ int i=100; int j=i; i++;//finally语句确实在return i;之前执行 return j;//return 100 Exception exception; exception; i++; throw exception; }
final、finally、finalize的区别:
final是一个关键字,表示不变的,最终的
final int i=100;
其中final修饰的类无法继承、修饰的方法无法覆盖、修饰的变量不能重新赋值。
finally也是一个关键字,和try联合使用,用在异常机制中,并且finally语句块中的代码一定会执行
finalize()是object类中的一个方法,作为方法名出现,属于标识符,这个方法是由垃圾回收器G负责调用的。