可能重复:
Why does this get error?
以下3种方法完全相同,显然会返回true。
但是,前两个编译但第三个编译没有(“缺少返回语句”)。
语言规范的哪一部分决定了这种行为?
boolean returnTrue_1() { // returns true
return true;
}
boolean returnTrue_2() { // returns true
for (int i = 0; ; i++) { return true; }
}
boolean returnTrue_3() { // "missing return statement"
for (int i = 0; i < 1; i++) { return true; }
}
答案 0 :(得分:4)
如果声明某个方法具有返回类型,则如果该方法的主体可以正常完成,则会发生编译时错误(第14.1节)。
答案 1 :(得分:3)
这样的方法必须有一个可以执行的返回语句,这在v3中不是这种情况。
在某些情况下,你知道人类的智慧会被称为返回被调用,但编译器无法知道它。
答案 2 :(得分:2)
编译器提供符合JLS 8.4.7的错误,因为它确定方法可以正常完成:
如果声明某个方法具有返回类型,则如果该方法的主体可以正常完成,则会发生编译时错误。
要确定方法是否可以正常完成,编译器需要确定for循环是否可以正常完成,这在JLS 14.21中定义:
如果至少满足下列条件之一,则基本for语句可以正常完成:
- 可以访问for语句,有条件表达式,条件表达式不是值为true的常量表达式。
- 有一个可到达的break语句退出for语句。
在第三种方法的情况下,有一个条件表达式,它不是一个常量表达式,因为i
不是最终的。因此for语句可以正常完成,因此方法也可以。
QED。
答案 3 :(得分:0)
Java确保如果方法具有返回类型,则必须在任何情况下返回某些内容。如果return语句位于条件语句内,则可能会也可能不会执行。因此,您必须在for循环之外放置一个return语句,以便编译代码。 在第二种情况下,没有条件,所以没有问题
答案 4 :(得分:0)
具有一些返回类型的函数必须确保return语句。任何条件块中的返回语句都不保证返回值。所以你可能会得到警告。
但是在案例3中,条件在开头是假的,因此您得到错误。
试一下ex:
int abc1(){
if(x>5) // warning because return is possible but not assured.
return x;
}
int abc2(){
x=0
if(x>0) // error because return is not possible
return x;
}
int abc3(){
if(x>0) // no error no warning because return is assured.
return x;
else
return 1;
}