1

我正在阅读 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此外,为什么要检查似乎有点困惑。我认为这是一个编程错误,根据他的话来判断:

对可以合理预期调用者恢复的条件使用检查异常

[...]

使用运行时异常来 指示编程错误

我虽然它应该是一个不受约束的。

问题:如果我们确保永远不会在某个地方抛出异常,那么将已检查异常的处理程序留空是否合适?

4

1 回答 1

3

而不是忽略异常,添加

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

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

于 2015-11-02T06:34:20.300 回答