4

重複の可能性:
なぜエラーが発生するのですか?

以下の 3 つのメソッドはまったく同じことを行い、明らかに true を返します。

ただし、最初の 2 つはコンパイルされますが、3 つ目はコンパイルされません (「return ステートメントがありません」)。

言語仕様のどの部分がその動作を規定していますか?

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

このようなメソッドには、実行が保証されているreturnステートメントが必要ですが、v3の場合はそうではありません。
ヒューマンインテリジェンスでは、returnが呼び出されることが保証されていることはわかっているが、コンパイラーはそれを認識できない場合があります。

于 2013-01-25T12:43:38.707 に答える
2

コンパイラは、メソッドが正常に完了できると判断したため、JLS 8.4.7に準拠してエラーを返します。

メソッドが戻り値の型を持つように宣言されている場合、メソッドの本体が正常に完了すると、コンパイル時エラーが発生します。

メソッドが正常に完了できるかどうかを判断するために、コンパイラは for ループが正常に完了できるかどうかを判断する必要があります。これはJLS 14.21で定義されています。

基本的な for ステートメントは、次のいずれかに該当する場合に正常に完了することができます。

  • for ステートメントは到達可能で、条件式があり、条件式は値が true の定数式ではありません。
  • for ステートメントを終了する到達可能な break ステートメントがあります。

3番目の方法の場合、条件式があり、i最終式ではないため定数式ではありません。そのため、for ステートメントは正常に完了することができ、結果としてメソッドも完了することができます。

QED。

于 2013-01-25T13:37:36.933 に答える
0

Javaは、メソッドにreturn型がある場合は、どのような場合でも何かを返す必要があることを確認します。returnステートメントが条件付きステートメント内にある場合、実行される場合と実行されない場合があります。したがって、コードをコンパイルするには、forループの外側にreturnステートメントを配置する必要があります。2番目のケースでは条件がないので問題ありません

于 2013-01-25T12:47:51.477 に答える
0

何らかの戻り値の型を持つ関数は、return ステートメントを保証する必要があります。条件付きブロック内の Return ステートメントは、値が返されることを保証しません。そのため、警告が表示される場合があります。

ただし、ケース 3 の場合、最初は条件が false であるため、エラーが発生します。

いくつかの例を試してください:

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 に答える