在Java 7中,catch块已得到改进,可以在单个catch块中处理多个异常。如果捕获多个异常并且它们具有相似的代码,则使用此功能将减少代码重复。让我们通过一个例子来理解java catch多个异常特性。
在Java 7之前,我们曾经逐一捕获多个异常,如下所示:
catch (IOException ex) {
logger.error(ex);
throw new MyException(ex.getMessage());
catch (SQLException ex) {
logger.error(ex);
throw new MyException(ex.getMessage());
}
在Java 7中,可以在一个catch块中捕获这两个异常,如下所示:
catch(IOException | SQLException ex){
logger.error(ex);
throw new MyException(ex.getMessage());
}
如果catch块处理多个异常,可以使用竖线(|)将它们分开,在这种情况下,exception参数(ex)是final,因此无法更改它。此功能使代码更少,可减少代码冗余。
Java重新抛出异常
在重新抛出异常的编译器分析中完成了另一项改进。Java rethrow异常用于在方法声明的throws子句中指定更具体的异常类型。
让我们看下面一个例子:
public class Java7MultipleExceptions {
public static void main(String[] args) {
try{
rethrow("abc");
}catch(FirstException | SecondException | ThirdException e){
//below assignment will throw compile time exception since e is final
//e = new Exception();
System.out.println(e.getMessage());
}
}
static void rethrow(String s) throws FirstException, SecondException,
ThirdException {
try {
if (s.equals("First"))
throw new FirstException("First");
else if (s.equals("Second"))
throw new SecondException("Second");
else
throw new ThirdException("Third");
} catch (Exception e) {
//below assignment disables the improved rethrow exception type checking feature of Java 7
// e=new ThirdException();
throw e;
}
}
static class FirstException extends Exception {
public FirstException(String msg) {
super(msg);
}
}
static class SecondException extends Exception {
public SecondException(String msg) {
super(msg);
}
}
static class ThirdException extends Exception {
public ThirdException(String msg) {
super(msg);
}
}
}
正如在上面所看到的,在rethrow方法中,catch块捕捉Exception,但它不是throws子句的一部分。Java 7编译器分析完整的try块以检查抛出哪些类型的异常,然后从catch块重新抛出。
¥ 我要打赏
纠错/补充
收藏
加QQ群啦,易百教程官方技术学习群
注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。