Des*_*PRG 3 java exception-handling intellij-idea
我的 IDE 一直抱怨在 catch 块之后的 hello() 方法中添加“retrun”语句。那个 return 语句不是无法访问吗?那我为什么要包括它?
import java.sql.SQLException;
public class Test {
public static void main(String[] args) {
hello();
}
public static boolean hello() {
try{
hello2();
} catch(SQLException e){
handleException();
}
return false;
}
public static String hello2() throws SQLException {
throw new SQLException("");
}
public static void handleException(){
throw new RuntimeException();
}
}
Run Code Online (Sandbox Code Playgroud)
那个 return 语句不是无法访问吗?
根据JLS规定的判断一个语句可达的规则,该return false;
语句是可达的。(有关详细信息,请参阅JLS 14.21 1。)
这些规则不考虑单独方法的行为。他们假设任何方法调用都可能返回,无论该方法是如何实际实现的。
如果方法位于单独的编译单元中,则 JLS 的假设是必不可少的。(考虑被调用方法被改变并重新编译而不重新编译调用方法的情况。)
在方法逻辑复杂的情况下也是必不可少的。在某些情况下,编译器无法确定某个方法是否可以终止;参见停机问题。Java 程序的“正确性”取决于编译器确定任意方法调用是否可以返回的能力,这将是一件坏事。简单的解决方案(由 JLS 采用)是编译器甚至不应该尝试这样做......为了可达性检查。
1 - 请注意,可达性规则与 Java 语言规范第一版中的规则基本相同。
归档时间: |
|
查看次数: |
325 次 |
最近记录: |