在Java中,我想这样做:
try {
...
} catch (/* code to catch IllegalArgumentException, SecurityException,
IllegalAccessException, and NoSuchFieldException at the same time */) {
someCode();
}
…而不是:
try {
...
} catch (IllegalArgumentException e) {
someCode();
} catch (SecurityException e) {
someCode();
} catch (IllegalAccessException e) {
someCode();
} catch (NoSuchFieldException e) {
someCode();
}
有什么办法吗?
自Java7以来,这是可能的。多捕获块的语法为:
try {
...
} catch (IllegalArgumentException | SecurityException | IllegalAccessException |
NoSuchFieldException e) {
someCode();
}
不过,请记住,如果所有异常都属于同一个类层次结构,则可以简单地捕获该基本异常类型。
还要注意,如果ExceptionB直接或间接从ExceptionA继承,则无法在同一块中捕获ExceptionA和ExceptionB。编译器会抱怨:
Alternatives in a multi-catch statement cannot be related by subclassing
Alternative ExceptionB is a subclass of alternative ExceptionA
解决方法是只在异常列表中包含祖先异常,因为它还会捕获后代类型的异常。
如果存在异常的层次结构,则可以使用基类来捕获异常的所有子类。在退化情况下,您可以通过以下方式捕获所有Java异常:
try {
...
} catch (Exception e) {
someCode();
}
在更常见的情况下,如果RepositoryException是基类,PathNotFoundException是派生类,则:
try {
...
} catch (RepositoryException re) {
someCode();
} catch (Exception e) {
someCode();
}
上述代码将捕获一种异常处理的RepositoryException和PathNotFoundException,所有其他异常都集中在一起。从Java 7开始,根据@OscarRyz的上述回答:
try {
...
} catch( IOException | SQLException ex ) {
...
}