[英]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 然后丟棄異常。
但是,由於現在不推薦使用 Thread 的 stop() 方法,因此您不應該使用它,因此您永遠不會看到 ThreadDeath。
Exception 只是 Throwable 的一種; NoSuchMethodError 不是Exception,而是Error,是另一種Throwable。
"你可以抓住
Throwable<\/code> 。
Error 和 Exception 擴展
Throwable<\/code> 。
Throwable 類是 Java 語言中所有錯誤和異常的超類。
正如其他海報所指出的,並非所有可拋出對象都是Exception
的子類。 但是,在大多數情況下,捕獲Error
或Throwable
並不是一個好主意,因為這些條件包括一些非常嚴重的錯誤條件,這些錯誤條件無法輕易恢復。 您的恢復代碼可能只會讓事情變得更糟。
首先讓我們澄清一下本次討論中一些不幸的語義混淆。 有
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.