1

これは、本「Absolute Java」のメソッドです。最後のelse文で戻り値0が必要な理由がわかりません。作者のコメントは「コンパイラを満足させるために必要」です。戻り値が 0 である理由はありますか、それとも任意の整数でしょうか?

public int getMonth( )
{
    if (month.equals("January"))
        return 1;
    else if (month.equals("February"))
        return 2;
    else if (month.equalsIgnoreCase("March"))
        return 3;
    else if (month.equalsIgnoreCase("April"))
        return 4;
    else if (month.equalsIgnoreCase("May"))
        return 5;
    else if (month.equals("June"))
        return 6;
    else if (month.equalsIgnoreCase("July"))
        return 7;
    else if (month.equalsIgnoreCase("August"))
        return 8;
    else if (month.equalsIgnoreCase("September"))
        return 9;
    else if (month.equalsIgnoreCase("October"))
        return 10;
    else if (month.equals("November"))
        return 11;
    else if (month.equals("December"))
        return 12;
    else
    {
        System.out.println("Fatal Error");
        System.exit(0);
        return 0; //Needed to keep the compiler happy
    }
}
4

3 に答える 3

8

これはプログラマー側の悪い設計であると私は主張しますが、それは十分に単純であり、私が思うに仕事を成し遂げます. この本は、この例についてより多くの文脈を提供しているのではないでしょうか? 多分彼らはこれを言語について主張するために使用し、実際に問題を解決するのではありませんか? これは、アプリケーション内のロジックの流れを制御する方法としては不適切だからです。

実行時に、アプリケーションは次の場所で終了します。

System.exit(0);

しかし、コンパイラはそれを知りません。コンパイラは、この関数が を返すintことを確認し、すべてのコード パスが値を返すことを要求します。コード パスの 1 つが実行時に別の方法で関数を終了する場合でも。そのため、最後のコード パスは値を返す必要があります。

return 0;

もちろん、任意の整数にすることができます。開発者が選ん0だのは簡単だからですが、本質的には恣意的です。実行時には、その行には到達しません。

于 2013-03-29T23:00:16.860 に答える
3

メソッドが値を返す場合、コンパイラは可能なすべての実行パスをテストして、値が返されるかどうかを確認します。そうでない場合、コンパイル時エラーが発生します。

アプリケーションなどを終了するかどうかを確認するために呼び出されたメソッドは調べません。コンパイラの観点からはSystem.exit()、他のメソッド呼び出しと同じです。ステートメントがないreturn 0;と、メソッドはその実行パスの値を返さず、これは違法です。実際には実行されなかったとしても。

于 2013-03-29T22:59:52.163 に答える
0

さらに良い

    System.exit(0);
    throw new AssertionError("won't reach here");
于 2013-03-29T23:47:42.617 に答える