在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
解决方法是只在异常列表中包含祖先异常,因为它还会捕获后代类型的异常。
对于Java6(即Android)上的user454322的答案,一个更简洁(但不那么冗长,可能不是首选)的替代方案是捕获所有异常并重新抛出RuntimeExceptions。如果您计划在堆栈的更上层捕获其他类型的异常(除非您也重新抛出它们),这将不起作用,但将有效地捕获所有已检查的异常。
例如:
try {
// CODE THAT THROWS EXCEPTION
} catch (Exception e) {
if (e instanceof RuntimeException) {
// this exception was not expected, so re-throw it
throw e;
} else {
// YOUR CODE FOR ALL CHECKED EXCEPTIONS
}
}
也就是说,对于冗长的问题,最好设置一个布尔值或其他变量,并基于此在try-catch块之后执行一些代码。
不,在Java 7之前,每个客户一个。
只要在所有情况下执行相同的操作,就可以捕获一个超类,比如java.lang.Exception。
try {
// some code
} catch(Exception e) { //All exceptions are caught here as all are inheriting java.lang.Exception
e.printStackTrace();
}
但这可能不是最佳做法。只有当您有实际处理异常的策略时,才应该捕捉到异常,而日志记录和重新思考并不是“处理它”。如果您没有纠正措施,最好将其添加到方法签名中,让它向能够处理这种情况的人冒泡。
使用JDK 7和更高版本,您可以执行以下操作:
try {
...
} catch (IllegalArgumentException | SecurityException | IllegalAccessException | NoSuchFieldException e) {
someCode();
}