2015-11-02 38 views
1

我正在閱讀J. Bloch的Effective Java,現在我在關於checked/unchecked exceptions的部分。他說,(強調雷):理解捕獲檢查的異常

由API用戶與檢查異常,在API設計 預sents的任務是從狀態中恢復對抗。用戶 通過捕捉異常並忽略它的任務,但 這通常是壞主意(項目65)。

現在,考慮返回具有相同類型或亞型類的所有靜態數據成員列表的方法:

public static <T> List<? extends T> getPublicStaticFields(Class<T> clazz){ 
    List<T> fields = new ArrayList<>(); 
    for(Field f : clazz.getDeclaredFields()){ 
     if(Modifier.isStatic(f.getModifiers()) && 
       Modifier.isPublic(f.getModifiers())){ 
      Object fieldValue; 
      try { 
       fieldValue = f.get(null); 
       if(clazz.isAssignableFrom(fieldValue.getClass())) 
        fields.add((T) fieldValue); 
      } catch (IllegalAccessException e) { } // <------- Ignoring the execption 
     } 
    } 
    return Collections.unmodifiableList(fields); 
} 

的事情是我不知道我應該放什麼異常處理器。我進行訪問的,如果條件檢查:

f(Modifier.isStatic(f.getModifiers()) && 
    Modifier.isPublic(f.getModifiers())) 

因此IllegalAccessViolation將永遠不會被拋出。此外,爲什麼IllegalAccessViolation被選中似乎有點困惑。我認爲這是一個編程錯誤,並judjing他所說的:

使用checked異常從中調用者可以 合理預期收回條件

[...]

使用運行時例外 表明編程錯誤

我雖然它應該是一個未經檢查的。

問:是,如果我們確保了expcetion將永遠不會被以前在什麼地方拋出它認爲適當的離開檢查異常空的哈德勒?

回答

3

不是忽略異常,加

throw new AssertionError("this should never happen"); 

到catch塊。這樣,如果您誤解了文檔,並且有效地發生了此異常,或者如果有人修改了代碼並刪除了使這種異常無法執行的檢查,那麼您將得到明確的異常,並顯示堆棧跟蹤,以指示問題是,而不是後面的問題,在不相關的代碼中,或者更糟糕:一個有效但不正確的結果。

+0

其實很好的建議。非常感謝。 –