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

Java intellij为什么抱怨向无法访问的语句添加返回,java,intellij-idea,exception-handling,Java,Intellij Idea,Exception Handling,我的IDE一直抱怨在catch块之后的hello()方法中添加一个“retrun”语句。返回语句不是不可访问吗?那我为什么要把它包括进去呢 import java.sql.SQLException; public class Test { public static void main(String[] args) { hello(); } public static boolean hello() { try{

我的IDE一直抱怨在catch块之后的hello()方法中添加一个“retrun”语句。返回语句不是不可访问吗?那我为什么要把它包括进去呢

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

编译
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
块处理,因此编译器认为所有的可能性,比如if
hello2()
可能不会总是抛出异常(或者编译器不进入Netegrity并假设该方法将返回值,只有在由于代码的动态行为而无法明确预测时),所以它要求返回语句

返回语句不是不可访问吗

根据JLS为确定语句是可访问的而指定的规则,
返回false;
语句是可访问的。(有关完整详细信息,请参阅1。)

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

如果方法位于单独的编译单元中,则JLS的假设非常重要。(请考虑在不重新编译调用方法的情况下更改并重新编译被调用方法的情况。)

在方法逻辑复杂的情况下,这一点也很重要。在某些情况下,编译器无法确定方法是否可以终止;c.f.the。这对“正确性”是一件坏事依赖于编译器的能力来确定任意方法调用是否可以返回的Java程序。简单的解决方案(JLS采用)是编译器甚至不应该为了可达性检查的目的尝试这样做


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