了解捕获已检查的异常

Understanding catching checked exceptions

我正在阅读 J. Bloch 的 Effective Java,现在我正在阅读有关 checked/unchecked 异常的部分。他说(强调我的):

By confronting the API user with a checked exception, the API designer pre- sents a mandate to recover from the condition. The user can disregard the mandate by catching the exception and ignoring it, but this is usually a bad idea(Item 65).

现在,考虑一个返回具有相同类型或子类型的 class 的所有静态数据成员列表的方法:

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 被检查似乎有点困惑。我认为这是一个编程错误,根据他所说的判断:

use checked exceptions for conditions from which the caller can reasonably be expected to recover

[...]

Use runtime exceptions to indicate programming errors

虽然应该是未检查的

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

不是忽略异常,而是添加

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

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