finally 和 return 關系的總結
- try塊中有System.exit(0)這樣的語句,由于它是終止Java虛拟機JVM的,連JVM都停止了,所有都結束了,當然finally語句也不會被執行到。
- 其它情況下,finally語句都必然會被執行。是以可以在這裡執行一些資源的釋放操作。
- finally中的return會覆寫try/catch中的renturn。
- 在finally中寫return語句會有警告,因為它會阻止函數抛出異常,而改為正常傳回。
package com.demo.test;
public class FinallyAndReturn {
private static void finallyAndTryReturn() {
try {
System.out.println("finallyAndTryReturn -> try");
return;
} catch (Exception e) {
System.out.println("finallyAndTryReturn -> catch");
} finally {
System.out.println("finallyAndTryReturn -> finally");
}
}
private static void finallyAndCatchReturn() {
try {
System.out.println("finallyAndCatchReturn -> try");
throw new Exception();
} catch (Exception e) {
System.out.println("finallyAndCatchReturn -> catch");
return;
} finally {
System.out.println("finallyAndCatchReturn -> finally");
}
}
// finally語句是在try的return語句執行之後,return傳回之前執行。
private static String tryReturn() {
String str = "initialized";
try {
System.out.println("tryReturn -> try");
str = "try";
return str;
} catch (Exception e) {
System.out.println("tryReturn -> catch");
str = "catch";
} finally {
System.out.println("tryReturn -> finally");
str = "finally";
}
return null;
}
private static String tryReturnAndFinallyReturn() {
String str = "initialized";
try {
System.out.println("tryReturnAndFinallyReturn -> try");
str = "try";
return str;
} catch (Exception e) {
System.out.println("tryReturnAndFinallyReturn -> catch");
str = "catch";
} finally {
System.out.println("tryReturnAndFinallyReturn -> finally");
/*
* Warning: finally block does not complete normally
* 如果finally塊中包含了return語句,即使前面的catch塊重新抛出了異常,則調用該方法的語句也不會獲得catch塊重新抛出的異常,而是會得到finally塊的傳回值,并且不會捕獲異常。
*/
str = "finally";
return str;
}
}
private static String tryThrowAndFinallyReturn() throws Exception {
String str = "initialized";
try {
System.out.println("tryThrowAndFinallyReturn -> try");
str = "try";
throw new Exception();
} catch (Exception e) {
System.out.println("tryThrowAndFinallyReturn -> catch");
str = "catch";
throw new Exception();
} finally {
System.out.println("tryThrowAndFinallyReturn -> finally");
/*
* Warning: finally block does not complete normally
* 如果finally塊中包含了return語句,即使前面的catch塊重新抛出了異常,則調用該方法的語句也不會獲得catch塊重新抛出的異常,而是會得到finally塊的傳回值,并且不會捕獲異常。
*/
str = "finally";
return str;
}
}
private static void finallyAndRuntimeException() {
try {
System.out.println("finallyAndRuntimeException -> try");
throw new RuntimeException();
} catch (Exception e) {
System.out.println("finallyAndRuntimeException -> catch");
} finally {
System.out.println("finallyAndRuntimeException -> finally");
}
}
private static void finallyAndExit() {
try {
System.out.println("finallyAndExit -> try");
// System.exit(0);是終止Java虛拟機JVM的,連JVM都停止了,所有都結束了,當然finally語句也不會被執行到。
System.exit();
} catch (Exception e) {
System.out.println("finallyAndExit -> catch");
} finally {
System.out.println("finallyAndExit -> finally");
}
}
public static void main(String[] args) {
finallyAndTryReturn();
System.out.println();
finallyAndCatchReturn();
System.out.println();
System.out.println("tryReturn return -> " + tryReturn());
System.out.println();
System.out.println("tryReturnAndFinallyReturn return -> " + tryReturnAndFinallyReturn());
System.out.println();
try {
System.out.println("tryThrowAndFinallyReturn return -> " + tryThrowAndFinallyReturn());
} catch (Exception e) {
e.printStackTrace();
}
System.out.println();
finallyAndRuntimeException();
System.out.println();
finallyAndExit();
}
}