Java 捕获多个异常,重新抛出异常
在 Java 7 中,catch 块已得到改进,可以在单个 catch 块中处理多个异常。如果您要捕获多个异常并且它们具有相似的代码,则使用此功能将减少代码重复。让我们通过一个例子来了解 Java 捕获多个异常的功能。
Java 捕获多个异常
在 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 块处理多个异常,您可以使用管道 (|) 将它们分开,在这种情况下,异常参数 (ex) 是最终的,因此您无法更改它。此功能生成的字节码更小,并减少了代码冗余。
Java 重新抛出异常
编译器对重新抛出的异常的分析也进行了另一项改进。Java 重新抛出异常允许您在方法声明的 throws 子句中指定更具体的异常类型。让我们通过一个小例子来看一下:
package com.journaldev.util;
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 块正在捕获异常,但它不是 throws 子句的一部分。Java 7 编译器会分析完整的 try 块,以检查抛出了哪些类型的异常,然后从 catch 块中重新抛出。请注意,如果您更改 catch 块参数,则此分析将被禁用。进一步阅读:Java 中的异常处理。