了解捕获检查的异常

时间:2015-11-02 06:25:01

标签: java exception checked-exceptions

我正在阅读J. Bloch的Effective Java,现在我正在关于检查/未检查异常的部分。他说(强调我的):

  

通过API设计人员与API用户面对检查异常   承担从条件中恢复的任务。用户可以   通过捕捉异常并忽略它来忽视任务,但是   这通常是 坏主意 (第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);
}

问题是我不知道我应该在异常处理程序中添加什么。我在if条件中执行访问检查:

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

因此永远不会抛出IllegalAccessViolation。此外,为什么IllegalAccessViolation被检查似乎有点困惑。我认为这是一个编程错误,并且根据他所说的判断:

  

使用已检查的例外情况来调用来电者的条件   合理地预计会恢复

     

[...]

     

使用运行时例外   表示编程错误

我虽然应该是一个未经考验的人。

问题: 如果我们确保在之前的任何地方永远不会抛出expcetion,那么将已检查异常的hadler留空是否合适?

1 个答案:

答案 0 :(得分:3)

添加

,而不是忽略异常
throw new AssertionError("this should never happen");

到catch区块。这样,如果你误解了文档并且这个IllegalAccessException例外有效发生,或者有人修改了代码并删除了使IllegalAccessException例外不可能的检查,那么你将有一个明确的例外,堆栈跟踪指示问题的确切位置,而不是以后的问题,在不相关的代码中,或更糟:结果有效但不正确。