finally的學習筆記

無論異常是否發生,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語句執行後在結束的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章