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執行完以後,再執行。