陷阱 - 忽略或擠壓異常

這個例子是故意忽略或擠壓異常。或者更確切地說,它是關於如何以忽略它的方式捕獲和處理異常。但是,在我們描述如何執行此操作之前,我們應該首先指出壓縮異常通常不是處理它們的正確方法。

通常會丟擲異常(通過某些東西)來通知程式的其他部分發生了一些重要(即異常)事件。通常(儘管不總是)異常意味著出了問題。如果你編寫程式來壓縮異常,那麼問題很可能會以另一種形式重新出現。更糟糕的是,當你壓縮異常時,你將丟棄異常物件及其關聯堆疊跟蹤中的資訊。這可能會讓人更難弄清楚問題的原始來源是什麼。

實際上,當你使用 IDE 的自動更正功能來修復由未處理的異常引起的編譯錯誤時,經常發生異常壓縮。例如,你可能會看到如下程式碼:

try {
    inputStream = new FileInputStream("someFile");
} catch (IOException e) {
    /* add exception handling code here */
}

很明顯,程式設計師已接受 IDE 的建議,使編譯錯誤消失,但建議不合適。 (如果檔案開啟失敗,程式應該很可能對它做一些事情。通過上面的更正,程式可能會在以後失敗;例如,使用 NullPointerException 因為 inputStream 現在是 null。)

話雖如此,這裡有一個故意壓縮異常的例子。 (出於爭論的目的,假設我們已經確定在顯示自拍時的中斷是無害的。)評論告訴讀者我們故意壓制異常,以及為什麼我們這樣做。

try {
    selfie.show();
} catch (InterruptedException e) {
    // It doesn't matter if showing the selfie is interrupted.
}

另一種常規方法是強調我們故意壓縮異常而不說明為什麼用異常變數的名稱來表示這一點,如下所示:

try { 
    selfie.show(); 
} catch (InterruptedException ignored) {  }

如果變數名稱設定為 ignored,某些 IDE(如 IntelliJ IDEA)將不會顯示有關空 catch 塊的警告。