4

可能重复:
为什么会出错?

下面的 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; }
}
4

5 回答 5

4

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

方法体

语句的正常和突然完成

于 2013-01-25T12:48:55.707 回答
3

这样的方法必须有一个保证执行的返回语句,而在 v3 中不是这种情况。
在某些情况下,您可以通过人类智能知道调用 return 是有保证的,但编译器却不知道。

于 2013-01-25T12:43:38.707 回答
2

编译器给出了符合JLS 8.4.7的错误,因为它确定该方法可以正常完成:

如果将方法声明为具有返回类型,则如果方法的主体可以正常完成,则会发生编译时错误。

判断方法能否正常完成,编译器需要判断for循环是否能正常完成,在JLS 14.21中有定义:

如果以下至少一项为真,则基本 for 语句可以正常完成:

  • for语句可达,有条件表达式,条件表达式不是值为true的常量表达式。
  • 有一个可到达的 break 语句退出 for 语句。

在第三种方法的情况下,有一个条件表达式,它不是一个常量表达式,因为i它不是最终的。所以for语句可以正常完成,结果方法也可以。

QED。

于 2013-01-25T13:37:36.933 回答
0

Java 确保如果方法具有返回类型,则无论如何都必须返回某些内容。如果返回语句在条件语句中,则它可能会被执行,也可能不会被执行。因此,您必须在 for 循环之外放置一个 return 语句才能编译您的代码。在第二种情况下,没有条件所以没问题

于 2013-01-25T12:47:51.477 回答
0

具有某种返回类型的函数必须保证返回语句。任何条件块中的返回语句不保证返回值。所以你可能会收到警告。

但在第 3 种情况下,开始时条件为假,因此您会收到错误消息。

尝试一些前:

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;
}
于 2013-01-25T12:52:57.923 回答