[英]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
確實是一個經過檢查的異常。 但是,未經檢查的異常也會擴展Exception
( RuntimeException
傳遞繼承),因此從編譯器執行的異常分析中排除包含Exception
類的catch
。
從RuntimeException
擴展的異常將被視為未經檢查的異常,所以沒關系:
class MyException extends RuntimeException { }
try {
...
} catch (MyException e) {
}
你的異常從Throwable
擴展,所以它被解除異常。 由於編譯器注意到它從未被拋出,因此編譯失敗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.