1、处理多种类型异常
catch (IOException ex) {
logger.log(ex);
throw ex;
catch (SQLException ex) {
logger.log(ex);
throw ex;
}
改进之后
catch (IOException|SQLException ex) {
logger.log(ex);
throw ex;
}
2、代码中对捕获再抛出异常时的处理
static class FirstException extends Exception { }
static class SecondException extends Exception { }
public void rethrowException(String exceptionName) throws Exception {
try {
if (exceptionName.equals("First")) {
throw new FirstException();
} else {
throw new SecondException();
}
} catch (Exception e) {
throw e;
}
}
以上例子的try块可以抛出FirstException或SecondException。假设你如果想指定两种异常类型的一种在方法声明中throws,在jdk7,是不允许的。因为catch中的异常参数e是Exception类型,和catch块中重新抛出异常e参数,你只能指定在方法声明中声明:该exception类型为Exception。
public void rethrowException(String exceptionName)
throws FirstException, SecondException {
try {
// ...
}
catch (Exception e) {
throw e;
}
}
jdk7中,你可以指定两种异常类型的一种在方法声明中throws。jdk7编译器可以确定异常抛出声明一定来自try块,同时所有的异常都来自try块,可能是FirstException或SecondException。虽然cathc块中的异常参数是Exception类型,编译器可以确定它是FirstException 或 SecondException中的哪一个实例。
jdk编译器的检测逻辑:
jdk7或jdk7以后,编译器验证重新抛出异常的逻辑:
1、try块能抛出这些异常;
2、前面没有其它catch块可以处理它。
3、它是catch子句异常参数之一的子类型或父类型。
注意:
当catch块中参数e被指定了其它值时,编译器的这种分析能力是被禁用的。
你只能使用Exception类型异常在方法的异常声明中。
jdk7编译器允许你指定异常类型FirstException and SecondException在方法的抛出声明,是因为你可以重新抛出FirstException 或 SecondException中的任何一个超类异常。
jdk7之前,你不能抛出catch从句异常参数的超类,否则会提示: unreported exception Exception; must be caught or declared to be thrown" at the statement throw e.编译器检查抛出的异常的类型是否可分配给rethrowException方法声明的throws子句中声明的任何类型。但是,catch参数e的类型是Exception,它是FirstException和secondexception的父类型,而不是子类型。