为什么第2行编译而第3行没有? spit()抛出已经在第1行捕获的HurtException,因此之后出现的任何已检查异常都应该无法访问。如果我删除第2行,第3行仍然可以访问。例外不能免于编译时检查。在此先感谢您为我澄清这一点。
public class Ape {
public void run() {
try {
spit();
} catch (HurtException e) { //line 1
System.out.println("f");
} catch (LimpException ex) { //line 2: Unreachable, HurtException already caught
System.out.println("e");
} catch (Exception ee) { //line 3: Compiles, why?
System.out.println("r");
}
}
public static void main(String[] args) {
new Ape().run();
}
public void spit() throws HurtException {
throw new HurtException();
}
class LimpException extends Exception {
}
class HurtException extends LimpException {
}
}
答案 0 :(得分:3)
编译器只“知道”可能从HurtException
抛出的spit()
,因为您以这种方式明确定义它。将LimpException
添加到方法签名的throws
部分应满足编译器:
public void spit() throws HurtException, LimpException {
throw new HurtException();
}
无论如何,如果该方法本身并没有真正抛出LimpException
,那么基本上只是让你的代码更难阅读。
答案 1 :(得分:2)
第3行编译,因为Exception
是所有RuntimeExceptions的超类,如果抛出它,它将在(catch Exception)
块的主体处理(在运行时)。
编译器无法确定是否在运行时抛出此类异常,因此不会将其标记为无法访问