public class ExceptionTest {
public static void throwit(){
throw new RuntimeException();
}
public static void main (String[]args){
try{
System.out.println("Hello");
throwit(); // doesn't compile if this line is replaced with throw new RuntimeException.
System.out.println("Done");
} catch (RuntimeException e) {
e.printStackTrace();
} finally {
System.out.println("Finally");
}
}
}
我正在尝试try-catch-finally并抛出异常而我无法弄清楚为什么我会以某种方式获得错误,而另一种方式是编译正常,即使他们做同样的事情。
我有一个名为throwit()
的方法,它抛出一个新的RuntimeException
。我在main方法的try块下调用它,所有编译都很好并且工作正常。但是,如果我将throwit();
替换为throw new RuntimeException
,而不是下面无法访问的行。
但是,不是throwit()
和throw new RuntimeException
做同样的事情吗? throwit()
引发了新的RunetimeException
,只是说throw new RuntimeException
做同样的事情。
所以,我的问题是为什么在直接调用RuntimeException
时抛出新的throw new RuntimeException
编译没有错误的方法会导致无法访问的行,即使它们执行完全相同的操作?如果有人能为我回答这一点,我将非常感激。
答案 0 :(得分:6)
因为当方法被硬编码以抛出RuntimeException
时,Java编译器中的static code analyser无法确定该行是不可达的;然而,当您对throws行进行硬编码时,编译器可以检测到下一个语句无法访问,并且不允许您编译。
JLS-14.21 Unreachable Statements部分说,
我们的想法是,从构造函数,方法,实例初始化程序或包含语句本身的静态初始化程序开始,必须有一些可能的执行路径。分析考虑了陈述的结构。除了对while,do和for条件表达式具有常量值true的语句的特殊处理外,在流分析中不考虑表达式的值。