簡體   English   中英

"未捕獲 Java 異常"

[英]Java exception not caught

為什么 Java 中的某些異常沒有被catch (Exception ex)<\/code> ? 這是代碼完全失敗並出現未處理的異常。 (Java 版本 1.4)。

public static void main(String[] args) {
    try {
        //Code ...
    } catch (Exception ex) {
        System.err.println("Caught Exception");
        ex.printStackTrace();
        exitCode = app.FAILURE_EXIT_CODE;
    }
    finally {
        app.shutdown();
    }
    System.exit(exitCode);
}

因為有些異常不是從Exception<\/code>派生的——例如Throwable<\/code>和Error<\/code> 。

基本上類型層次結構是:

       Object
         |
      Throwable
     /         \
Exception      Error

Error<\/code><\/a>不是Exception<\/code><\/a> 。

類 Exception 及其子類是 Throwable 的一種形式,它指示合理的應用程序可能想要捕獲的條件。

-- java.lang.Exception 的 JavaDoc<\/a>

Error 是 Throwable 的子類,表示合理的應用程序不應嘗試捕獲的嚴重問題。

-- java.lang.Error 的 JavaDoc<\/a>

您可能想要捕獲某些錯誤,例如ThreadDeath<\/a> 。 ThreadDeath 被歸類為錯誤,如下所述

ThreadDeath 類特別是 Error 而不是 Exception 的子類,即使它是“正常發生”,因為許多應用程序捕獲所有發生的 Exception 然后丟棄異常。

-- ThreadDeath 的 JavaDoc<\/a>

但是,由於現在不推薦使用 Thread 的 stop() 方法,因此您不應該使用它,因此您永遠不會看到 ThreadDeath。

Exception 只是 Throwable 的一種; NoSuchMethodError 不是Exception,而是Error,是另一種Throwable。

"

你可以抓住Throwable<\/code> 。 Error 和 Exception 擴展Throwable<\/code> 。

請參閱 Throwable JavaDoc<\/a> :

Throwable 類是 Java 語言中所有錯誤和異常的超類。

正如其他海報所指出的,並非所有可拋出對象都是Exception的子類。 但是,在大多數情況下,捕獲ErrorThrowable並不是一個好主意,因為這些條件包括一些非常嚴重的錯誤條件,這些錯誤條件無法輕易恢復。 您的恢復代碼可能只會讓事情變得更糟。

首先讓我們澄清一下本次討論中一些不幸的語義混淆。 java.lang.Exception<\/code>類,我們可以簡單地將其稱為帶有大寫“E”的 Exception。 然后你有一個小寫“e”的例外,這是一種語言特性。 您可以在Throwable<\/code>類的文檔<\/a>中查看小寫版本:

出於對異常的編譯時檢查的目的,Throwable 和任何不是 RuntimeException 或 Error 的子類的 Throwable 子類都被視為已檢查異常。

對我來說,更容易將這個問題的答案視為已檢查與未檢查的異常(小寫 e)。 已檢查的異常必須在編譯時考慮,而未檢查的異常則不需要。 異常(大寫 E)及其子類是已檢查異常,這意味着您要么必須捕獲代碼可能拋出的任何異常,要么聲明您的方法可能拋出的異常(如果未捕獲)。

Error 及其子類是未經檢查的異常,這意味着您的代碼既不必捕獲可能拋出的錯誤,也不必聲明拋出這些錯誤。 RunTimeException 及其子類也是未經檢查的異常,盡管它們位於類層次結構中。

考慮以下代碼:

運行時,上面的代碼將產生java.lang.ArithmeticException<\/code> 。 即使拋出異常並且代碼既沒有捕獲 ArithmeticException 也沒有聲明它拋出了這個異常,這也將編譯沒有任何錯誤。 這就是未檢查異常的本質。

考慮ArithmeticException<\/code>在類層次結構中的位置,尤其是它是 java.lang.Exception 的子類這一事實。 這里有一個派生自 java.lang.Exception 的異常,但因為它也是 java.lang.RuntimeException 的子類,所以它是未經檢查的異常,因此您不必捕獲它。

如果你想抓住任何可能被拋出的東西,抓住一個 Throwable。 然而,這可能不是最安全的做法,因為其中一些 Throwable 可能是致命的運行時條件,可能不應該被捕獲。 或者,如果您確實捕獲了 Throwable,您可能想要重新拋出您無法處理的 Throwable。 這取決於上下文。

"

暫無
暫無

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

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