9

重複の可能性:
コンパイラーは、return ステートメントが欠落している状態に到達することは不可能であるにもかかわらず、「return ステートメントが欠落している」と不平を言う

Java の次のメソッドは正常にコンパイルされます。

public String temp() {
    while(true) {
        if(true) {
            // Do something.
        }
    }
}

メソッドには、正常にコンパイルされますが、ステートメントjava.lang.Stringのない明示的な戻り値の型があります。returnただし、次のメソッドはコンパイルに失敗します。

public String tempNew() {
    if(true) {
        return "someString";
    }        
}

ステートメントで指定された条件が常に trueであっても、 " missing returnstatement "を示すコンパイル時エラーが発行されます (リフレクションによっても変更されることのない定数があります)。コンパイルを成功させるには、メソッドを次のように変更する必要があります。ifboolean

public String tempNew() {
    if(true) {
        return "someString";
    } else {
        return "someString";
    }
}

また

public String tempNew() {
    if(true) {
        return "someString";
    }

    return "someString";
}

whileループの最初のケースに関しては、2 番目のケースはコンパイルに失敗しますが、合法であるように見えます。

コンパイラの機能の1つを超えた2番目のケースには理由がありますか?

4

2 に答える 2

3

デッドコードだからです。デッド コード分析は、メソッド リターン分析への別のパスで実行されます。この分析では、分岐条件の内部を調べる、より詳細な分析が行われます。

于 2012-10-20T17:34:51.630 に答える
1

Java チュートリアルから: 次のように、while ステートメントを使用して無限ループを実装できます。

while (true){
    // your code goes here
}

したがって、コンパイラはこれが無限であることを認識しているため、返されない可能性があります。つまり、return ステートメントは必ずしも必要ではありません。

一方、if (true)行 (それ自体) は戻ります。したがって、すべての戻りブランチをカバーする必要があります。

于 2012-10-20T17:36:59.757 に答える