什么是finally:
try关键字后面可以定义finally代码块。而finally中定义的代码是最后执行的。不管有没有抛出异常都会执行finally中的代码。通常在finally完成资源的释放和关闭。
分析以下代码:
public static void main(String[] args) {
try{
System.out.println("try...");
return;
}finally {
System.out.println("finally");
}
}
运行结果为:
try...
finally
解释:在上面的代码中,执行到try里面的return;语句时,转向执行finally中的代码。说明即使在try中有return;语句。finally中的代码也是会执行的,执行finally完毕后再执行return;语句,程序结束。
在分析以下代码
public static void main(String[] args) {
int result = m1();
System.out.println(result);
}
private static int m1() {
int i = 100;
try{
return i;
}finally{
i++;
}
}
运行结果
100
为什么是100呢?通过代码可知,在main方法中,调用了m1()方法,在m1()方法中有try..finally代码块。问题在于,在执行完m1()方法后,返回的值是多少,为什么是100,而不是101?
在try..finally代码中 的 i++;语句和return i ;语句谁先执行?如果是i++;语句先执行,为什么不是101?
如果是return i ; 语句先执行,那么finally里面的语句就不会执行。违反了语句规则。
解释:我们将这个生成的class 文件,反编译成java文件。
public static int m1(){
int i = 100;
int j = i;
i++;
return j;
}
结果:通过代码可知,return i; 语句确实是在i++ ;语句之后执行的,符合语法规则,然而实际上返回的不是i变量,是新建了一个j变量,存储了i变量未发生变化之前的值。返回的也是i变量未改变之前的状态。