![](/img/trans.png)
[英]Why JVM does not allow to throw Unchecked Exception from static block?
[英]Why Exception class behaves like unchecked exception and does not require try block to throw any checked or even any exceptions at all?
異常是已檢查的異常。 當相應的try塊什么都沒扔時,為什么我可以寫catch (Exception e)
? 任何其他經過檢查的異常(如IOException)均不允許使用此技巧。 一些書說Throwable也應被視為檢查異常,但是它的行為就像Exception。
void f() {
try {
} catch (Exception e) { // fine!
}
}
void f() {
try {
} catch (Throwable e) { // also fine!
}
}
PS在JLS中發現了這一點:
如果catch子句可以捕獲經過檢查的異常類E1,則是編譯時錯誤,並且與catch子句相對應的try塊不能拋出作為E1的子類或超類的經過檢查的異常類, 除非E1是Exception或Exception的超類。
如果查看Exception
的代碼,您會發現它擴展了Throwable:
public class Exception extends Throwable
n可以throw
任何東西都是Throwable
。 盡管這提供了一定程度的靈活性,因為您可以創建一個擴展可拋出(也可以拋出)的自定義類。 異常幾乎只是Throwable的簡約包裝。 所以本質上:
try{
//something here that goes wrong causing:
throw new Exception("Thrown");
}catch(Throwable e){
System.out.println("Caught");
}
盡管捕獲異常也可以。 但是,如果您創建一個擴展Throwable的新類,則捕獲Exception
無效。
這意味着,如果可以將Exception作為通用語句捕獲,則還可以捕獲其超類Throwable。 請注意,這樣做不是一個好習慣,但是我提到它是因為有可能。 如果您必須抓住一些常規的東西,那就抓住Exception,而不是Throwable。
路易斯·瓦瑟曼的評論是正確的。 Exception是RuntimeException的超類。 因此,捕獲異常也會捕獲所有未檢查的異常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.