1. ホーム
  2. java

[解決済み] String switch文はなぜNullケースをサポートしないのですか?

2022-06-10 18:42:43

質問

私は、なぜJava 7の switch ステートメントが null ケースをサポートせず、代わりに NullPointerException ? 以下のコメント行をご覧ください。 の Java Tutorials の記事から引用しました。 switch ):

{
    String month = null;
    switch (month) {
        case "january":
            monthNumber = 1;
            break;
        case "february":
            monthNumber = 2;
            break;
        case "march":
            monthNumber = 3;
            break;
        //case null:
        default: 
            monthNumber = 0;
            break;
    }

    return monthNumber;
}

これによって if の前に null をチェックする必要がなくなりました。 switch を使用します。

どのように解決するのですか?

damryfbfnetsiとして が指摘するように をコメントで紹介しています。 JLS §14.11 には、次のような注記があります。

の使用禁止は null をスイッチラベルとして使うことを禁止することで、決して実行されることのないコードを書くことを防いでいます。もし switch 式が参照型である場合、つまり String またはボックス化されたプリミティブ型やenum型である場合、式の評価値が null と評価されると実行時エラーが発生します。 Javaプログラミング言語の設計者の判断では、これは、黙って全体の switch ステートメントをスキップしたり、(もしあれば) default ラベルの後に実行することを選択します。

(強調)

最後の文では case null: を使用する可能性をスキップしていますが、合理的であり、言語設計者の意図への見解を提供しているように見えます。

むしろ実装の詳細に目を向けると このブログの記事 Christian Hujer によるこのブログ記事では、なぜ null がスイッチで許可されない理由について、洞察に満ちた推測をしています(ただし、その中心は enum スイッチではなく String スイッチよりも)。

フードの下では switch ステートメントは通常、タブレススイッチのバイトコードにコンパイルされます。そして、"physical" への引数は switch とそのケースは int s. スイッチを入れる int 値は、メソッドを起動して Enum.ordinal() . ...]序数は0から始まります。

つまり、マッピング null0 は良いアイデアではないでしょう。最初のenum値のスイッチはnullと見分けがつかないでしょう。enum の序数を 1 から数え始めるのは良い考えだったかもしれません。しかし、そのように定義されていませんし、この定義は変更できません。

一方 String スイッチ は異なる実装になっています enum スイッチが先にあり、参照型が null .