抛出RuntimeException,无法访问的行

时间:2014-12-15 02:43:02

标签: java exception-handling

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编译没有错误的方法会导致无法访问的行,即使它们执行完全相同的操作?如果有人能为我回答这一点,我将非常感激。

1 个答案:

答案 0 :(得分:6)

因为当方法被硬编码以抛出RuntimeException时,Java编译器中的static code analyser无法确定该行是不可达的;然而,当您对throws行进行硬编码时,编译器可以检测到下一个语句无法访问,并且不允许您编译。

JLS-14.21 Unreachable Statements部分说,

  

我们的想法是,从构造函数,方法,实例初始化程序或包含语句本身的静态初始化程序开始,必须有一些可能的执行路径。分析考虑了陈述的结构。除了对while,do和for条件表达式具有常量值true的语句的特殊处理外,在流分析中不考虑表达式的值。