为什么我的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;
}
}
答案 0 :(得分:1)
该数组可能为空,在这种情况下将不会输入循环。添加
return y;
在您的for
循环中处理该可能性之后。另外,您不需要循环即可检查一个数组值。您的代码也可以是
if (x1 == 5) {
return x;
}
return y;
答案 1 :(得分:0)
Java语言规范要求非void方法中的每个可能的返回路径均具有return
语句。令人折服的是,语言实现可能返回路径的方式不是您所期望的。
在编写的示例中,您(程序员)知道数组中始终会有一个元素,因此循环主体将始终(至少)执行一次,并且您的两个return语句之一将始终为被执行。
编译器不知道这一点。实际上,用于确定确定赋值和语句可到达性的JLS规则说,在for
循环之后的语句位置是可到达的,因此该方法可能返回路径。因此,JLS说这是编译错误。
注意:编译器必须实施JLS并产生该错误,否则它不是兼容的编译器。 (并且会导致代码可移植性问题!)
他们为什么要这样指定Java语言?
编写软件来分析源代码并确定是否可以到达语句是一个难题。它本质上是一个自动定理证明问题。
Java设计人员(敏感性)认为,强制Java编译器实现解决此问题将是一件坏事。如果不同的编译器具有不同的功能,这将成为源代码编译问题的源头……这对程序员不利。
但是设计者要做希望程序具有指定的行为。因此,他们为可达性指定了“保守”定义...有时会迫使程序员添加冗余语句。