Hel*_*esh 9 java exception-handling
在此示例中,第二个catch块无法访问,因此我的代码无法编译.但是,如果我使用LimpExceptionextend RuntimeException而不是Exception,则编译没有任何麻烦.为什么?
public class Finals {
public void run() {
try {
spit();
} catch (HurtException e) {
System.out.println("");
} catch (LimpException ex) { // does not compile, unreachable code
System.out.println("");
}
}
public void spit() throws HurtException { // method that throws the Exception
}
public static void main(String... args) {
}
}
class LimpException extends Exception { // extends Exception vs extends
// RuntimeException
}
class HurtException extends LimpException {
}
Run Code Online (Sandbox Code Playgroud)
根据JLS§11.2:
未经检查的异常类(第11.1.1节)免于编译时检查.
这很简单.即使该代码块仍然无法访问,编译器也不会检查.
在您的示例中,LimpException不能从catch LimpExceptioncatch块未捕获的try语句主体抛出.这被JLS§11.2.3禁止:
如果catch子句可以捕获已检查的异常类E1并且不是对应于catch子句的try块可以抛出作为E1的子类或超类的已检查异常类的情况,那么这是编译时错误,除非E1是异常或异常的超类.
如果catch子句可以捕获(第11.2节)已检查的异常类E1并且紧跟的try语句的前一个catch子句可以捕获E1或E1的超类,则这是编译时错误.