Java中的finally一定會被執(zhí)行嗎?
點擊關(guān)注公眾號,Java技術(shù)文及時送達
一、前言
二、finally一定會執(zhí)行嗎?
1.在執(zhí)行try塊之前直接return,我們發(fā)現(xiàn)finally塊是不會執(zhí)行的
public class TryCatchTest {
private static int total() {
int i = 11;
if (i == 11) {
return i;
}
try {
System.out.println("執(zhí)行try");
} finally {
System.out.println("執(zhí)行finally");
}
return 0;
}
public static void main(String[] args) {
System.out.println("執(zhí)行main:" + total());
}
}
輸出結(jié)果:
執(zhí)行main:11
復(fù)制代碼
2.在執(zhí)行try塊之前制造一個錯誤,直接爆紅
public class TryCatchTest {
private static int total() {
return 1 / 0;
try {
System.out.println("執(zhí)行try");
} finally {
System.out.println("執(zhí)行finally");
}
return 0;
}
public static void main(String[] args) {
System.out.println("執(zhí)行main:" + total());
}
}
public class TryCatchTest {
private static int total() {
try {
System.out.println("執(zhí)行try");
System.exit(0);
} catch (Exception e) {
System.out.println("執(zhí)行catch");
} finally {
System.out.println("執(zhí)行finally");
}
return 0;
}
public static void main(String[] args) {
System.out.println("執(zhí)行main:" + total());
}
}
輸出結(jié)果:
執(zhí)行try
三、finally執(zhí)行時機探討
public class TryCatchTest {
private static int total() {
try {
System.out.println("執(zhí)行try");
return 11;
} finally {
System.out.println("執(zhí)行finally");
}
}
public static void main(String[] args) {
System.out.println("執(zhí)行main:" + total());
}
}
輸出結(jié)果:
執(zhí)行try
執(zhí)行finally
執(zhí)行main:11
public class TryCatchTest {
private static int total() {
try {
System.out.println("執(zhí)行try");
return 1 / 0;
} catch (Exception e) {
System.out.println("執(zhí)行catch");
return 11;
} finally {
System.out.println("執(zhí)行finally");
}
}
public static void main(String[] args) {
System.out.println("執(zhí)行main:" + total());
}
}
輸出結(jié)果:
執(zhí)行try
執(zhí)行catch
執(zhí)行finally
執(zhí)行main:11
四、finally塊中的返回值
1.finally塊不含返回值,但是做改變變量值的操作
public class TryCatchTest {
private static int total() {
int i = 0;
try {
System.out.println("執(zhí)行try:" + i);
return i;
} finally {
++i;
System.out.println("執(zhí)行finally:" + i);
}
}
public static void main(String[] args) {
System.out.println("執(zhí)行main:" + total());
}
}
輸出結(jié)果:
執(zhí)行try:0
執(zhí)行finally:1
執(zhí)行main:0
++i使得i等于1,在執(zhí)行return i; 自然會返回1。2.finally中含有返回值
public class TryCatchTest {
private static int total() {
try {
System.out.println("執(zhí)行try");
return 1;
} finally {
System.out.println("執(zhí)行finally");
return 2;
}
}
public static void main(String[] args) {
System.out.println("執(zhí)行main:" + total());
}
}
輸出結(jié)果:
執(zhí)行try
執(zhí)行finally
執(zhí)行main:2
public class TryCatchTest {
private static int total() {
int i = 1;
try {
System.out.println("執(zhí)行try:" + i);
return i;
} finally {
++i;
System.out.println("執(zhí)行finally:" + i);
return i;
}
}
public static void main(String[] args) {
System.out.println("執(zhí)行main:" + total());
}
}
輸出結(jié)果:
執(zhí)行try:1
執(zhí)行finally:2
執(zhí)行main:2
public class TryCatchTest {
private static int total() {
int i = 1;
try {
System.out.println("執(zhí)行try:" + i);
} finally {
++i;
System.out.println("執(zhí)行finally:" + i);
}
return i;
}
public static void main(String[] args) {
System.out.println("執(zhí)行main:" + total());
}
}
執(zhí)行結(jié)果:
執(zhí)行try:1
執(zhí)行finally:2
執(zhí)行main:2
如有文章對你有幫助,
歡迎關(guān)注??、點贊??、轉(zhuǎn)發(fā)??!
評論
圖片
表情

