return 可以当作终止语句,常用它来结束当前方法,并返回一个值给调用方法。然后结束该方法不执行return下面的语句。
finally :无论try语句发生了什么,无论抛出异常还是正常执行。finally语句都会执行。(正常情况下)
问题:在try语句里使用return后,finally是否会执行?
如果执行,那么执行顺序是怎么执行的?
答案在底下
public static void main(String[] args) {
System.out.println("return value : " + text());
}
public static int text() {
int i = 1;
try {
return i;
} finally {
System.out.println("It is in final chunk.");
i++;
}
}
//A.It is in final chunk. // return value : 1 //B.It is in final chunk. // return value : 2 //C.return value : 1 // It is in final chunk. //D.return value : 2 // It is in final chunk.
finally块总是在try块退出时执行。 这确保了即使发生意外异常也会执行finally块。 但finally不仅仅用于异常处理——它允许程序员避免因return、continue或break而意外绕过清理代码。 将清理代码放在finally块中始终是一个很好的实践,即使在预期没有异常的情况下也是如此。 注意:如果JVM在执行try或catch代码时退出,那么finally块可能不会执行。比如出现了异常,虚拟机被终止了等... 同样,如果执行try或catch代码的线程被中断或终止,那么finally块可能不会执行,即使应用程序作为一个整体继续执行。
public static void main(String[] args) {
int k = test();
System.out.println(k);
}
public static int test(){
int a = 0;
int i = 1;
try{
a = a++;
return a;
}
finally{
System.out.println("It is in final chunk.");
a = i++;
return a;
}
}
//A.It is in final chunk. // 0 //B.It is in final chunk. // 1 //C.It is in final chunk. // 2 //C.It is in final chunk. // 3
如果try子句执行一个return,编译后的代码会执行以下操作: 1. 在局部变量中保存返回值(如果有的话)。 2. 执行jsr则在finally执行语句的代码。 3.执行finally语句的代码返回时,返回保存在局部变量中的值。
小结:在try语句里使用return后,finally会执行。return返回的值会存入栈中,执行完finally将值返回。return中使用++自增时要++a不能a++,不然return获取的值是a不会进行++,只有++a才会有效。如果finally中也有return,根据栈先入后出原则,try中的return不会输出,输出的时finally。
答案:A B
(如有不足,请多多指教!)