[解決済み] String switch文はなぜNullケースをサポートしないのですか?
質問
私は、なぜ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から始まります。つまり、マッピング
null
を0
は良いアイデアではないでしょう。最初のenum値のスイッチはnullと見分けがつかないでしょう。enum の序数を 1 から数え始めるのは良い考えだったかもしれません。しかし、そのように定義されていませんし、この定義は変更できません。
一方
String
スイッチ
は異なる実装になっています
は
enum
スイッチが先にあり、参照型が
null
.
関連
-
Java のエラーです。未解決のコンパイル問題 解決方法
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 4 at text.Division.main(Divisi
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] Rubyのswitch文の書き方
-
[解決済み] Pythonのswitch文の代用品?
-
[解決済み] switch文の中で変数を宣言してはいけないのはなぜですか?
-
[解決済み] Stringでswitch文が使えないのはなぜですか?
-
[解決済み] JavaScriptで複数ケースを扱うSwitch文
-
[解決済み] switch文の複数ケース
-
[解決済み】1つのswitch case文に2つの値を使用する場合
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Java エラー報告 スレッド "main" での例外 java.util.NoSuchElementException
-
springboot project MIMEタイプ text/htmlで転送された静的ファイルを読み込む。
-
IllegalArgumentException この例外を解決する方法
-
javaの実行中に「javaの例外が発生しました」と表示された場合はどうすればよいですか?
-
SpringBootApplication を型解決できない。
-
xxx:jarのアーティファクトディスクリプタの読み込みに失敗した問題は解決しました。
-
spring-boot 401 このリソースにアクセスするには完全な認証が必要です エラー解決
-
JSPで「リストが型解決できない!」の解決方法
-
maven プラグイン エラー プラグインの実行は、ライフサイクル構成ソリューションの対象外です。
-
[解決済み] Stringでswitch文が使えないのはなぜですか?