繁体   English   中英

为什么 intellij 抱怨添加一个无法访问的语句的返回

[英]why intellij complains to add a return to an unreachable statement

我的 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();
    }
}

那个 return 语句不是无法访问吗?

根据JLS规定的判断语句可达的规则, return false; 声明是可达的。 (有关详细信息,请参阅JLS 14.21 1 。)

这些规则不考虑单独方法的行为。 他们假设任何方法调用都可能返回,无论该方法是如何实际实现的。

如果方法位于单独的编译单元中,则 JLS 的假设是必不可少的。 (考虑被调用方法被改变并重新编译而不重新编译调用方法的情况。)

在方法逻辑复杂的情况下也是必不可少的。 在某些情况下,编译器无法确定某个方法是否可以终止; 参见停机问题 Java 程序的“正确性”取决于编译器确定任意方法调用是否可以返回的能力,这将是一件坏事。 简单的解决方案(由 JLS 采用)是编译器甚至不应该尝试这样做......为了可达性检查。


1 - 请注意,可达性规则与 Java 语言规范第一版中的规则基本相同。

编译器在编译hello()时并没有分析hello2()handleException()的代码,所以不知道这些方法总是抛出异常。 因此,它需要在hello()使用return语句,因为就编译器而言,try-catch 块后面的代码是可访问的。

如果您将方法更改为直接抛出异常而不是调用抛出异常的方法,则不需要 return 语句:

public static boolean hello() {
    try{
        throw new SQLException("");
    } catch(SQLException e){
        throw new RuntimeException();
    }
}

try-catch简单地说尝试问题并解决它并继续执行进一步的代码

 try{
            hello2(); // exception 
        } catch(SQLException e){ // may occur , handle here 
            handleException();
        }
       // normal execution from here 

        return false; 

加上你的hello2()抛出已经由catch块处理的异常,所以编译器认为所有的可能性,比如如果hello2()可能不会总是抛出异常(或者编译器不进入 Netegrity 并假设该方法将返回值,仅当由于代码的动态行为而无法清楚地预测时),因此它要求该情况下的 return 语句

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM