2

次のコードは、ステートメント「return mon;」の「m」を指しているエラーを示しています。このメソッドの開始時に非常に明確に初期化されている場合、「変数 mon が初期化されていない可能性があります」と表示されます。それはとても単純なものでなければなりません、私には理解できません! ありがとうございました。

public String monthName(int month)
{
    String mon;
    switch (month)
    {
        case 1:
            mon = "January";
            break;
        case 2:
            mon = "February";
            break;
        case 3:
            mon = "March";
            break;
        case 4:
            mon = "April";
            break;
        case 5:
            mon = "May";
            break;
        case 6:
            mon = "June";
            break;
        case 7:
            mon = "July";
            break;
        case 8:
            mon = "August";
            break;
        case 9:
            mon = "September";
            break;
        case 10:
            mon = "October";
            break;
        case 11:
            mon = "November";
            break;
        case 12:
            mon = "December";
            break;
    }
    return mon;
}
4

3 に答える 3

12

month常に 1 から 12 の間の整数であると誰が言えますか? コンパイラは確かにそれを保証できません。

monnull に初期化するか、 のdefaultケースで動作を設定しますswitch。(また、月の名前を一時変数に設定する代わりに、直接返すこともできます。)

あるいは、より簡単な解決策は次のとおりです。

String[] monthNames = {"January", "February", ..., "December"};
return monthNames[month - 1];
于 2013-03-13T19:05:13.057 に答える
0

月番号が正しくない場合にnullを返すことは、呼び出し元がそれが発生することを予期し、nullをチェックする準備ができている場合にのみ有効です。

呼び出し元のルーチンがnullリターンをチェックしない場合は、デフォルトの場合にRuntimeExceptionをスローする必要があります。これは、月の名前が間違っているためにnullポインター例外が発生して、コードが後で失敗することを許可するよりもはるかに優れています。

例えば..

default:
  throw new RuntimeException("Invalid month number "+ month);

これにより、monが初期化されていない状態でreturnステートメントに到達する方法がないため、コンパイラーの不満もなくなります。

于 2013-03-13T19:22:04.033 に答える