簡體   English   中英

Java Exception as checked Exception但不需要在trycatch中拋出

[英]Java Exception as checked Exception but not required to be thrown in trycatch

我有這個片段。

public final class StackOverflow{
   class MyException extends Throwable{
   }
   private void a(){
       try{
       }catch(MyException | Exception e){
       }
   }
}
exception StackOverflow.MyException is never thrown in body of corresponding try statement

我知道Exception也在擴展Throwable,也是一個經過檢查的異常,MyException也在擴展Throwable,這也是一個經過檢查的異常!

我的問題是為什么不需要在try catch中拋出異常,但MyException是? 我認為兩者都是檢查異常所以哪個區別?

對不起,問題很簡單。

它在Java語言規范中進行了解釋(以粗體強調):

如果catch子句可以捕獲已檢查的異常類E1並且不是對應於catch子句的try可以拋出作為E1的子類或超類的已檢查異常類的情況,那么這是編譯時錯誤, 除非E1是Exception或類的超類Exception

我想這背后的基本原理是: MyException確實是一個經過檢查的異常。 但是,未經檢查的異常也會擴展ExceptionRuntimeException傳遞繼承),因此從編譯器執行的異常分析中排除包含Exception類的catch

RuntimeException擴展的異常將被視為未經檢查的異常,所以沒關系:

class MyException extends RuntimeException { }

try {
    ...
} catch (MyException e) {

}

你的異常從Throwable擴展,所以它被解除異常。 由於編譯器注意到它從未被拋出,因此編譯失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM