Java 7及更高版本
从Java
7开始,支持多异常捕获。
语法为:
try { // stuff} catch (Exception1 | Exception2 ex) { // Handle both exceptions}的静态类型
ex是列出的异常中最特殊的通用超类型。有一个很好的功能,如果您将其重新抛出
ex,编译器就会知道只能抛出列出的异常之一。
Java 6及更早版本
在Java 7之前,有多种方法可以解决此问题,但是它们往往比较笨拙并且有局限性。
方法1
try { // stuff} catch (Exception1 ex) { handleException(ex);} catch (Exception2 ex) { handleException(ex);}public void handleException(SuperException ex) { // handle exception here}如果异常处理程序需要访问在之前声明的局部变量,则这会变得很混乱
try。而且,如果处理程序方法需要重新引发异常(并进行了检查),则签名会遇到严重问题。具体来说,
handleException必须声明为throwing
SuperException…这可能意味着您必须更改封闭方法的签名,依此类推。
方法#2
try { // stuff} catch (SuperException ex) { if (ex instanceof Exception1 || ex instanceof Exception2) { // handle exception } else { throw ex; }}同样,我们在签名方面存在潜在的问题。
方法#3
try { // stuff} catch (SuperException ex) { if (ex instanceof Exception1 || ex instanceof Exception2) { // handle exception }}如果省略
else零件(例如,因为目前没有其他子类型
SuperException),则代码将变得更加脆弱。如果异常层次结构进行了重组,则没有的该处理程序
else可能最终会悄悄地吞噬异常!



