害怕錯誤,但不要用 Java 編寫它們!您可能已經對Java 中的異常有所了解。今天,至少粗淺的知識會讓你受益。我們將分析 Error 類和一種特殊的異常類型,當它出現在堆棧跟踪中時會嚇到很多人。

在 Java 的異常層次結構的頂部是Throwable類,它有兩個後代:

  • Exception,它負責程序中的錯誤。
  • 而我們今天的主角——Error 它負責 JVM 中的錯誤。
    值得一提的是,這些可能甚至不是編碼錯誤,而是通常不依賴於開發人員的問題。

如何處理錯誤

當捕獲“錯誤”時,除了logging之外,您不能在catch塊中執行任何操作,因為我們正在談論 JVM 本身的問題。

日誌記錄很好:當您遇到運行時錯誤時,您可以查看日誌,了解其原因,並知道要修復什麼。

由於您不知道在編寫代碼時可能會遇到什麼樣的錯誤,因此在 catch中編寫特定類型是沒有意義的。使用Error類本身也不是最好的解決方案,因為在這種情況下,您只會捕獲錯誤。

因此,最好使用Throwable類,它可以捕獲ErrorException。這在實踐中看起來如何?

這樣寫代碼是不行的:

try {
    // Your code
} catch (OutOfMemoryError outOfMemoryError) {
    // Code to catch OutOfMemoryError
}
像這樣寫代碼也不行:

try {
    // Your code
} catch (Error error) {
    // Code to catch all Errors
}
但是像這樣的代碼是可以的:

try {
    // Your code
} catch (Throwable throwable) {
    // Code to catch all Throwables
}

處理錯誤的第二個選項是在方法上聲明throws子句後將它們拋得更高。當您的代碼理論上可能會拋出錯誤並且您想預先警告可能使用您的代碼的每個人以便他們能夠正確處理錯誤時,可以使用此技術。

常見錯誤

一些最常見的錯誤是OutOfMemoryErrorStackOverflowError類。

OutOfMemoryError通常出現在程序沒有足夠的內存來創建對象而垃圾收集器跟不上的時候。結果是OutOfMemoryError

Java 不允許您手動刪除對像以防止內存洩漏,但您可以避免亂扔垃圾,以免垃圾收集器過度工作,也不會弄亂堆。

例如,像這樣的代碼會在內存中產生大量垃圾:


while (true) {
    new Object();
}

我要告訴您的第二個錯誤是 StackOverflowError 它在堆棧溢出時拋出。由於堆棧主要存儲局部變量、參數和方法調用,遞歸(或遞歸方法調用)是導致此錯誤的一個非常常見的原因:


public void foo() {
    foo();
}

為了避免程序執行期間出現問題,現代 IDE 經常警告遞歸調用方法。

您無法修復拋出錯誤的程序,但您可以編寫不會拋出錯誤和破壞程序的代碼。注意你對內存的處理,仔細創建對象,並正確調用方法。如果你這樣做,那麼你的代碼中的問題就會更少。

錯誤和異常類型之間的區別

錯誤 例外
無法在catch塊中更正 可以在catch塊中處理
不會在編譯時發生 可以在編譯時捕獲
JVM 中的問題 代碼邏輯問題
所有錯誤都未選中 選中未選中

您無法在 Java 中逃避異常,但您不應該害怕它們。您只需要了解每種類型代表什麼並知道如何處理它。今天就到這裡!再見!