簡體   English   中英

為什么Exception類的行為類似於未檢查的異常,並且不需要try塊來拋出所有已檢查的乃至任何異常?

[英]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.

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