java 两个catch_在Java中是否可以在同一个catch块中捕获两个异常?

在Java中是否可以在同一个catch块中捕获两个异常?

这个问题在这里已有答案:

我可以在同一个catch子句中捕获多个Java异常吗?                                     9个答案

我需要捕获两个异常,因为它们需要相同的处理逻辑。 我想做的事情如下:

catch (Exception e, ExtendsRuntimeException re) {

// common logic to handle both exceptions

}

是否可以避免重复每个catch块中的处理程序代码?

6个解决方案

192 votes

Java 7及更高版本

从Java 7开始支持多异常捕获。

语法是:

try {

// stuff

} catch (Exception1 | Exception2 ex) {

// Handle both exceptions

}

静态类型else是列出的例外中最专业的常见超类型。 有一个很好的功能,如果你在catch中重新抛出SuperException,编译器知道只能抛出一个列出的异常。

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

}

如果异常处理程序需要访问在else之前声明的局部变量,则会变得混乱。如果处理程序方法需要重新抛出异常(并且已经检查),那么您将遇到严重的签名问题。 具体来说,必须将SuperException声明为抛出else ...这可能意味着您必须更改封闭方法的签名,依此类推。

方法#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的处理程序可能最终会默默地吃异常!

Stephen C answered 2019-07-15T21:37:56Z

33 votes

Java< = 6.x只允许您为每个catch块捕获一个异常:

try {

} catch (ExceptionType name) {

} catch (ExceptionType name) {

}

文档:

每个catch块都是一个异常处理程序并处理其类型   其论点表明的例外情况。 参数类型,ExceptionType,   声明处理程序可以处理的异常类型,必须是   从Throwable类继承的类的名称。

对于Java 7,您可以在一个catch块上捕获多个Exception:

catch (IOException|SQLException ex) {

logger.log(ex);

throw ex;

}

文档:

在Java SE 7及更高版本中,单个catch块可以处理多个   异常类型。 此功能可以减少代码重复和减少   抓住一个过于广泛的例外的诱惑。

参考:[http://docs.oracle.com/javase/tutorial/essential/exceptions/catch.html]

Francisco Spaeth answered 2019-07-15T21:38:51Z

12 votes

如果您不在Java 7上,则可以将异常处理提取到方法中 - 这样您至少可以最小化重复

try {

// try something

}

catch(ExtendsRuntimeException e) { handleError(e); }

catch(Exception e) { handleError(e); }

jeff answered 2019-07-15T21:39:15Z

2 votes

对于Java< 7你可以使用if-else和Exception:

try {

// common logic to handle both exceptions

} catch (Exception ex) {

if (ex instanceof Exception1 || ex instanceof Exception2) {

}

else {

throw ex;

// or if you don't want to have to declare Exception use

// throw new RuntimeException(ex);

}

}

编辑并替换Throwable with Exception。

Sarel Botha answered 2019-07-15T21:39:46Z

2 votes

在Java SE 7发布之前,我们习惯于使用与try块关联的多个catch语句编写代码。一个非常基本的例子:

try {

// some instructions

} catch(ATypeException e) {

} catch(BTypeException e) {

} catch(CTypeException e) {

}

但是现在有了Java的最新更新,我们可以在一个catch子句中处理多个异常,而不是编写多个catch语句。 这是一个示例,说明如何实现此功能。

try {

// some instructions

} catch(ATypeException|BTypeException|CTypeException ex) {

throw e;

}

因此,单个catch子句中的多个异常不仅简化了代码,还减少了代码的冗余。我发现这篇文章很好地解释了这个功能及其实现。Java 7改进和更好的异常处理这对你也有帮助。

Saurab Parakh answered 2019-07-15T21:40:24Z

1 votes

[http://docs.oracle.com/javase/tutorial/essential/exceptions/catch.html]涵盖了在同一个块中捕获多个异常。

try {

// your code

} catch (Exception1 | Exception2 ex) {

// Handle 2 exceptions in Java 7

}

我正在制作学习卡,这个帖子很有用,只是想把我的两分钱。

Eli answered 2019-07-15T21:40:55Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值