1. 程式人生 > >java中try、catch、finally執行順序

java中try、catch、finally執行順序

在面試的時候,經常會問到關於try、catch、finally相關的問題。總結一下。

case 1

    try{ } catch{ } finally{ } return;

    public int condition1(){
        try {
            System.out.println(1);
        } catch (Exception e){
            System.out.println(2);
        } finally {
            System.out.println(3);
        }
        return 4;
    }

    執行順序為 try --> finally --> return,列印結果 1,3,4。因為沒有報錯,所以catch是不會執行的。

case 2

     try{ return; } catch{ } finally{ } return;

    public int condition2(){
        try {
            System.out.println(1);
            return 2;
        } catch (Exception e){
            System.out.println(3);
        } finally {
            System.out.println(4);
        }
        return 5;
    }

    執行順序為 try --> finally --> try中的return,列印結果1,4,2。finally的執行順序優先於return,而且不管報錯與否一定會執行,所以在可能出錯的io操作中,在finally中關閉io流。

case 3

    try{ } catch{ return; } finally{ } 

    public int condition3(){
        try {
            System.out.println(1);
            throw new RuntimeException();
        } catch (Exception e){
            System.out.println(2);
            return 3;
        } finally {
            System.out.println(4);
        }
//        return 5;
    }

    為了讓程式出錯,直接丟擲了異常。最後一行的return注掉了,因為catch中已經確定了return,最後的return語句無法執行到,idea會報錯。正常的程式碼中,不會有這種操作,因為異常不是百分百丟擲的。

    執行順序 try --> catch --> finally --> catch中的return,列印結果1,2,4,3。return代表整個程式碼塊的結束,如果先執行return,就沒finally什麼事了,更不會存在finally無論在什麼情況下都會執行的預設。

case 4

    try{ return;  } catch{ return; } finally{ return; } 

    public int condition4(){
        try {
            System.out.println(1);
            return 2;
        } catch (Exception e){
            System.out.println(3);
            return 4;
        } finally {
            System.out.println(5);
            return 6;
        }
//        return 7;
    }

    無異常丟擲,執行順序  try --> catch --> finally --> finally中的return,列印結果 1,5,6。

case 5

    try{  } catch{ return; } finally{ return; } 

    public int condition5(){
        try {
            System.out.println(1);
            throw new RuntimeException();
        } catch (Exception e){
            System.out.println(2);
            return 3;
        } finally {
            System.out.println(4);
            return 5;
        }
//        return 6;
    }

    有異常丟擲,執行順序 try --> catch --> finally --> finally中的return,列印結果 1,2,3,5。

結論:1.執行順序為 try --> catch --> finally --> return。

           2.任何情況下,finally都會執行,如果finally中有return,則會提前結束返回。一般情況下,不在finally中寫return。

           3.try,catch中有return,會先執行finally,再執行return

          4.如果finally中對返回的變數值再次進行修改,try,catch中的return還是修改前的值。即,finally執行前,return的值已經寫好,只不過是在等finally執行完以後,再執行。