無論異常是否發生,finally子句都將執行。
try-catch-finally是規定了順序的,順序錯誤就會顯示編譯錯誤
而finally的用處就是即使異常沒被捕獲,程序終止,也能執行,eg:
public class FINALLY {
public static void main(String[] args){
Scanner Input = new Scanner(System.in);
try{
int a = Input.nextInt();
int b = Input.nextInt();
int c = a/b;
System.out.println(a + " / " + b + " = " + c);
}
catch(ArithmeticException ex){
System.out.println("wrong");
}
finally{
System.out.println("0");
}
}
}
輸入1.0 2(使異常不會被捕獲)將顯示:
0
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:864)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at 第12章.FINALLY.main(FINALLY.java:10)
Java Result: 1
若將finally{ System.out.println("0"); }改爲System.out.println("0");
同樣輸入1.0 2,顯示的結果爲
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:864)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at 第12章.FINALLY.main(FINALLY.java:10)
Java Result: 1
在一些特殊的情況下,finally的子句將不會執行,例:既在執行finally語句之前,先執行了System.exit(0)(正常退出),或者System.exit(1(非零))(強制退出);程序將退出Java虛擬機,即不會在執行語句之後的任何語句。但若將System.exit(int)換成return則不行,程序將會依然執行finally語句。eg:
public class FINALLY1 {
public static void main(String[] args){
try{
int a = 2/0;
}
catch(Exception ex){
System.out.println("1");
System.exit(0);
}
finally{
System.out.println("2");
}
System.out.println("3");
}
}
程序顯示的結果爲:
1
而如果將System.exit(0)改爲return:程序將顯示的結果爲:
1
2
程序是先將finally語句執行後在結束的。