在此示例中,第二个catch块不可访问,因此我的代码无法编译。但是,如果我将LimpException
扩展为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 {
}
最佳答案
根据JLS §11.2:
那很简单。即使该代码块仍然无法访问,编译器也不会检查。
在您的示例中,无法从尚未被LimpException
catch块捕获的try语句主体中抛出catch LimpException
。这是JLS §11.2.3禁止的: