gpt4 book ai didi

java - 抛出 RuntimeException,无法访问的行

转载 作者:行者123 更新时间:2023-12-03 23:13:17 30 4
gpt4 key购买 nike

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 block 下调用它,一切都编译得很好并且工作正常。但是,如果我将 throwit(); 替换为 throw new RuntimeException 而不是无法访问的下一行。

但是,throwit()throw new RuntimeException 不是在做同样的事情吗? throwit() 抛出一个新的 RunetimeException 并且只是说 throw new RuntimeException 也做同样的事情。

所以,我的问题是为什么抛出新的 RuntimeException 的方法在直接调用 throw new RuntimeException 时编译没有错误导致无法访问的行,即使它们做同样的事情?如果有人能为我回答这个问题,我将不胜感激。

最佳答案

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

JLS-14.21 Unreachable Statements部分说,

The idea is that there must be some possible execution path from the beginning of the constructor, method, instance initializer, or static initializer that contains the statement to the statement itself. The analysis takes into account the structure of statements. Except for the special treatment of while, do, and for statements whose condition expression has the constant value true, the values of expressions are not taken into account in the flow analysis.

关于java - 抛出 RuntimeException,无法访问的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27476626/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com