關於try,finally異常。finally一定會執行嗎?
阿新 • • 發佈:2021-02-19
關於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());
}
}
結果如下:
解釋:在第四點的基礎上自己可以解釋了,就不囉嗦了
謝謝閱讀,無誤點贊,有誤還望評論區指正。