为什么编译器仍然要求return语句?

时间:2019-04-06 01:27:50

标签: java loops methods return

为什么我的Java编译器已经在if语句循环中放置了return语句,为什么要求它返回return语句?以及如何解决此问题,使其返回正确的值?

public static String checkNumbers(int x1, int y1, int x2, int y2, int x3, int y3) {

    String x = "True";
    String y = "False";


    int[][] array = {{x1, y1}, {x2, y2}, {x3, y3}};

    for (int i = 0; i < array.length; i++) {
        if (array[0][0] == 5) {
             return x;

        } else return y;
    }

}

2 个答案:

答案 0 :(得分:1)

该数组可能为空,在这种情况下将不会输入循环。添加

return y;

在您的for循环中处理该可能性之后。另外,您不需要循环即可检查一个数组值。您的代码也可以是

if (x1 == 5) {
    return x;
}
return y;

答案 1 :(得分:0)

Java语言规范要求非void方法中的每个可能的返回路径均具有return语句。令人折服的是,语言实现可能返回路径的方式不是您所期望的。

在编写的示例中,您(程序员)知道数组中始终会有一个元素,因此循环主体将始终(至少)执行一次,并且您的两个return语句之一将始终为被执行。

编译器不知道这一点。实际上,用于确定确定赋值和语句可到达性的JLS规则说,在for循环之后的语句位置是可到达的,因此该方法可能返回路径。因此,JLS说这是编译错误。

注意:编译器必须实施JLS并产生该错误,否则它不是兼容的编译器。 (并且会导致代码可移植性问题!)


他们为什么要这样指定Java语言?

编写软件来分析源代码并确定是否可以到达语句是一个难题。它本质上是一个自动定理证明问题。

  • 像您的示例这样的简单案例相对(将)相对容易。 (例如,可以通过符号执行来完成。)
  • 其他情况将更加困难,并且通常会超出自动定理证明的“技术水平”。
  • 有些案例无法分析; c.f.停止问题。

Java设计人员(敏感性)认为,强制Java编译器实现解决此问题将是一件坏事。如果不同的编译器具有不同的功能,这将成为源代码编译问题的源头……这对程序员不利。

但是设计者要做希望程序具有指定的行为。因此,他们为可达性指定了“保守”定义...有时会迫使程序员添加冗余语句。