了解捕获已检查的异常
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
异常不可能发生的检查,您将有一个明显的异常,带有指示问题所在的精确位置的堆栈跟踪,而不是以后出现的问题,在不相关的代码中,或者更糟:有效但不正确的结果。
我正在阅读 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
异常不可能发生的检查,您将有一个明显的异常,带有指示问题所在的精确位置的堆栈跟踪,而不是以后出现的问题,在不相关的代码中,或者更糟:有效但不正确的结果。