问题:finally中的代码一定会执行吗?
答案:不会。
情况分类:
1不抛出异常:try里面的代码、finally里面的代码、finally以后的代码都将正常执行,而catch里面的代码不会执行。
2抛出异常且被catch捕获:try里面的代码部分执行,catch里面的代码、finally里面的代码、finally以后的代码都将正常执行。
3抛出异常,但未被catch捕获:抛出异常的语句将会报错,在try中的抛出异常的语句后的语句将不会执行,由于异常未被捕获,故catch语句不执行,但是finally仍然会执行,在finally后面的语句由于程序已经报错停止,故将不会执行。
不会执行finally中的代码的具体情况:
第一种情况:程序未执行到 finally 块。
1.在执行 try 块之前直接 return,finally 块是不会执行的。
2.在执行 try 块之前程序直接报错,那么finally块自然就不会执行到了。
3.在执行try块时,调用System.exit(0)主动退出jvm。
第二种情况:程序执行到 finally 块。
1.finally 块不含返回值。简单总结:若finally中无return,以try中的return为准。
//结果返回0。这是因为Java程序会把try或者catch块中的返回值保留,
//也就是暂时的确认了返回值,然后再去执行finally代码块中的语句。等到finally代码块执行
//完毕后,如果finally块中没有返回值的话,就把之前保留的返回值返回出去。
public class TryCatchTest {
private static int total() {
int i = 0;
try {
System.out.println("执行try:" + i);
return i;
} finally {
++i;
System.out.println("执行finally:" + i);
}
}
public static void main(String[] args) {
System.out.println(">>>>>>>>>输入结果:" + total());
}
}
2.finally 块含返回值。简单总结:finally块的方法有返回值时,要对于return出现的地方进行具体分析。在finally块中进行return操作的话,则方法整体的返回值就是finally块中的return返回值。如果在finally块之后的方法内return,则return的值就是进行完上面的操作后的return值
public class TryCatchTest {
private static int total() {
int i = 0;
try {
System.out.println("执行try:" + i);
return i;
} finally {
++i;
System.out.println("执行finally:" + i);
return i;
}
}
public static void main(String[] args) {
System.out.println(">>>>>>>>>输入结果:" + total());
}
}
public class TryCatchTest {
private static int total() {
int i = 0;
try {
System.out.println("执行try:" + i);
return i;
} finally {
++i;
System.out.println("执行finally:" + i);
}
return i;
}
public static void main(String[] args) {
System.out.println(">>>>>>>>>输入结果:" + total());
}
}