[解決済み] Javaスイッチにおける変数の宣言と初期化
質問
Javaスイッチについて、おかしな質問があります。
int key = 2;
switch (key) {
case 1:
int value = 1;
break;
case 2:
value = 2;
System.out.println(value);
break;
default:
break;
}
シナリオ1
key
が 2 の場合、値を 2 として正常に表示します。
シナリオ2 - 私がコメントするとき
value = 2
で
case 2:
という鳴き声がします。
ローカル変数の値が初期化されていない可能性があります。
.
質問です。
シナリオ1:もし実行フローが
case 1:
に行かない場合(その時
key = 2
のように)、ではどうやって値変数の型を知るのでしょうか?
int
?
シナリオ 2 : もしコンパイラが値変数の型として
int
という型がわかっている場合、コンパイラはその型にアクセスするために
int value = 1;
の式にアクセスしなければなりません。
case 1:
.宣言と初期化)。では、なぜsqawrkするのかというと、コメントするときに
value = 2
で
case 2:
を言うと、その
ローカル変数の値が初期化されていない可能性があります。
.
どのように解決するのですか?
Switch文は、基本的にスコープがおかしいです。から セクション 6.3 の :
ブロック内の局所変数宣言のスコープ (§14.4) は、宣言が現れたブロックの残りの部分であり、それ自身のイニシャライザから始まり、局所変数宣言文の右側にあるさらなる宣言子も含まれます。
あなたの場合
case 2
が同じ
ブロック
として
case 1
の後に表示され、たとえ
case 1
は決して実行されないのに、その後に表示されます。したがって、ローカル変数はスコープ内で
書き込み
宣言は論理的に決して実行されないにもかかわらずです。(初期化はそうですが、宣言は実際には "実行可能" ではありません)。
をコメントアウトすると
value = 2;
をコメントアウトしても、コンパイラはどの変数を参照しているかを知っていますが、それに値を割り当てる実行パスを通過していないため、他の定義されていないローカル変数を読もうとしたときと同じようにエラーが発生します。
私が強くお勧めするのは ではなく で宣言されたローカル変数を使用しないことを強くお勧めします。私が switch 文でローカル変数を導入する場合 (これはめったに行わないようにしています。case は非常に短いのが理想的です)、通常は新しいスコープを導入することを好みます。
case 1: {
int value = 1;
...
break;
}
case 2: {
int value = 2;
...
break;
}
この方がわかりやすいと思います。
関連
-
アクセス制限です。タイプ 'Application' は API ではない(必要なライブラリに制限がある)。
-
Collections.sortがdoubleでソートできない問題を完璧に解決する。
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] Javaで配列を宣言し、初期化する方法は?
-
[解決済み] Java内部クラスと静的ネストされたクラス
-
[解決済み] C#がforeachで変数を再利用するのは理由があるのか?
-
[解決済み] JavaScriptの配列宣言で「Array()」と「[]」はどう違うのですか?
-
[解決済み] Mapを実装し、挿入順序を保持するJavaクラス?
-
[解決済み】Javaで複数の変数を同じ値で初期化する方法
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
Collections.sortがdoubleでソートできない問題を完璧に解決する。
-
メモ帳でJavaプログラムをコンパイルして実行すると、Could not find or load main class ...というエラーが表示される。解決方法
-
List list = new ArrayList(); Error: ArrayList は型に解決できません。
-
maven レポート エラー 解決不可能な親POM
-
JNIエンカウンターエラー:構造体またはユニオンではない何かでメンバー 'FindClass' のリクエスト
-
Javaがエラーで実行される、選択が起動できない、最近起動したものがない
-
Java Runtime Environmentを継続するためのメモリが不足しています。
-
アクセス制限の解決方法: ---- in Java
-
htmlとwordの相互変換の実装(画像あり)
-
[解決済み] switchケースでの変数のスコープ [重複]。