Java執行時異常try-catch塊能捕捉到嗎
阿新 • • 發佈:2021-01-11
技術標籤:Java基礎java執行時異常執行時異常捕捉執行時異常能捕捉嗎try-catch 執行時異常
還記得2年前見過這個問題,當時沒太在意,這次寫demo復現了這個問題。Java執行時異常能捕捉嗎?
背景:比如檔案上傳後的刪除操作
delete
,id
不存在丟擲執行時異常。 刪除方法是public void delete()
,因為MVC
中的Model
層沒有宣告異常,service
中的delete
呼叫dao
中的delete
,dao
中的delete
去呼叫xml
或者資料庫delete
操作。現在前端需要接收到刪除成功和失敗的提示,後端刪除失敗是會有執行時異常的,最後需要給前端返回類似{return:"ok"}
或者{return:"你的異常資訊"}
方法大概兩種,第一就是刪除資料失敗直接返回boolean
型別值,方法改為public boolean delete()
,第二種就是把執行時異常一層層上拋到Controller
進行try-catch
處理,在catch
塊中返回錯誤的json
資料{return:"你的異常資訊"}
思考的問題來了,執行時異常一層層往上丟擲,try-catch
能接住嗎?如果接不住你就沒法處理失敗資訊傳給前端了。那咱們就來試一試。
public class HelloWorld{
public static void test() {
try {
throw new RuntimeException("test RuntimeException123");
} catch (RuntimeException e) {
System.out.println("裡面");
throw new RuntimeException(e.getMessage());
} catch (Exception f) {
System.out.println("ff");
}
}
public static void test2() {
System. out.println("執行到test2");
test();
System.out.println("test()拋異常後面還會執行嗎?");
}
public static void main(String[] args) {
try {
test2();
} catch(Exception e) {
e.printStackTrace();
System.out.println("外面");
}
}
}
結果我們發現,test()
中,執行時異常被try-catch
接住了,然後繼續往上拋,在test2()
中沒有try-catch
塊,結果在main
方法還是能接住。
得出結論:
執行時異常不需要throws
宣告,即使是方法層層呼叫,也能丟擲到最上層後再用try-catch
捕捉。所以,執行時異常可以捕捉,但是沒必要捕捉,除非功能特殊需要。
歡迎一鍵三連~
有問題請留言,大家一起探討學習
----------------------Talk is cheap, show me the code-----------------------