2015-11-02 37 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

其实很好的建议。非常感谢。 –