关于try,finally。finally一定会执行吗?
答案肯定不是。
先看一下结论:
(1)当出现在try之前就有结果返回,也就是有return时,则不会往下执行。
(2)当try之中出现异常时,会执行catch语句,然后是finally;当try中有return时,会将结果返回给finally,然后看finally中是否还有返回语句,如果有则将finally中的结果返回,finally中没有返回语句则将try中的返回语句返回。
进入正文
以案例来说明:
- try之前就结果返回
public class Demo01 {
private static int test() {
int i = 1;
if (i == 1) {
return i;
}
try {
System.out.println("执行try");
} finally {
System.out.println("执行finally");
}
return 0;
}
public static void main(String[] args) {
System.out.println("执行main:" + test());
}
}
结果如下:

解释:因为try之前已经return,所以程序中的方法后边就不执行了。也就是finally也不会执行。
- try中有异常
public class Demo02 {
private static int test02() {
try {
System.out.println("执行try");
return 1 / 0;
} catch (Exception e) {
System.out.println("执行catch");
return 11;
} finally {
System.out.println("执行finally");
}
}
public static void main(String[] args) {
System.out.println("执行main:" + test02());
}
}
结果如下:

解释:因为try之前没有return,先执行try,try中有异常,执行catch并将结果11返回给主线程,最后执行finally
- try中有返回语句
public class Demo03 {
private static int test03() {
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("执行main:" + test03());
}
}
结果如下:

解释:因为try之前没有return,先执行try,try中有返回,将其返回给finally,最后执行finally,此时i为0,++i之后为1,最后返回主线程是try中返回的i,所以主线程中的值是0。
- try和finally中都有返回语句
public class Demo04 {
private static int test04() {
try {
System.out.println("执行try");
return 1;
} finally {
System.out.println("执行finally");
return 2;
}
}
public static void main(String[] args) {
System.out.println("执行main:" + test04());
}
}
结果如下:

解释:因为try之前没有return,先执行try,try中有返回,将其返回给finally,最后执行finally,finally中有返回语句,则直接将其返回给主线程,所以主线程最终值为2。
- try和finally中都有返回语句(对第四点的深入理解)
public class Demo05 {
private static int test05() {
int i = 1;
try {
System.out.println("执行try:" + i);
i++;
return i;
} finally {
++i;
System.out.println("执行finally:" + i);
return i;
}
}
public static void main(String[] args) {
System.out.println("执行main:" + test05());
}
}
结果如下:

解释:在第四点的基础上自己可以解释了,就不啰嗦了
谢谢阅读,无误点赞,有误还望评论区指正。