在for循环中返回

时间:2013-01-25 12:40:55

标签: java for-loop jls

  

可能重复:
  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; }
}

5 个答案:

答案 0 :(得分:4)

  

如果声明某个方法具有返回类型,则如果该方法的主体可以正常完成,则会发生编译时错误(第14.1节)。

method body

Normal and Abrupt Completion of Statements

答案 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)

具有一些返回类型的函数必须确保ret​​urn语句。任何条件块中的返回语句都不保证返回值。所以你可能会得到警告。

但是在案例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;
}