簡體   English   中英

何時考慮在 Java 中捕獲特定異常與一般異常

[英]When to consider catching Specific Exceptions Vs General Exception in Java

捕獲像下面的選項 1 這樣的特定異常非常常見,也被認為是捕獲異常的保存方式,為什么選項 2 很少被考慮,因為它會變得多么冗長(不確定這是否是要使用的詞!) ,這就是我的理解迄今為止。 我的問題是,是否還有其他情況應該考慮捕獲選項 2(一般異常)而不是選項 1 之類的異常?

選項 1 -> 特定例外:

try{
    TextIO.putf(s);
    FileOutputStream mFileOutputStream = new FileOutputStream("/content/doc/test.pdf", true);
}catch (FileNotFoundException notfEx){
       //Do something
}catch (NullPointerException nullEx){
       //Do something
}catch(IllegalArgumentException illEx){
       //Do something
}

選項 2 -> 一般例外:

try{
    TextIO.putf(s);
    FileOutputStream mFileOutputStream = new FileOutputStream("/content/doc/test.pdf", true);
   }catch (Exception ex){                
    if(ex.getClass() == java.io.FileNotFoundException.class) {
      //Do something
    }else if(ex.getClass() == java.lang.IllegalArgumentException.class){
      //Do something
    }else if(ex.getClass() == java.lang.NullPointerException.class){
      //Do something
    }
  }
}

您只是在問錯誤的問題,這是過早優化的典型例子。

兩個選項之間的(可能為零)性能差異根本無關緊要。

請記住:您正在談論處理剛剛拋出的異常。 請放心:由於使用選項 1 或 2,創建該異常並收集其堆棧跟蹤的成本比某些假設收益高數千倍

因此:您可以安全地忽略此處的性能。 您只需做一些更容易閱讀,更容易讓您的代碼的人類讀者理解的事情。 這當然要求使用版本 1。正如評論指出的那樣:實際上,您的選項 2 並不等同於選項 1(因為它忽略了異常的子類)。 因此,選項 2 不僅難以閱讀和維護,而且很可能導致意外(錯誤)的異常處理。

最后:您也是 Java 新手程序員另一個常見問題的受害者。 他們假設“您在源 Java 中所做的事情”是運行時 Java 性能的相關因素。 但事實並非如此。 java真正的性能來自於JIT,以及它把java字節碼編譯成機器碼的努力。 您必須確保 JIT 能夠很好地完成工作(當然:避免代碼中出現愚蠢的錯誤)。 再說一遍:您的想法對“如何實現績效”沒有任何意義。

暫無
暫無

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

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