web-dev-qa-db-ja.com

スイッチケースの変数のスコープ

スイッチケースでスコープがどのように機能するか理解していないと思います。

最初のコードはコンパイルされないが、2番目のコードはコンパイルされる理由を誰かに説明できますか?

コード1:

 int key = 2;
 switch (key) {
 case 1:
      String str = "1";
      return str;
 case 2:
      String str = "2"; // duplicate declaration of "str" according to Eclipse.
      return str;
 }

コード2:

 int key = 2;
 if (key == 1) {
      String str = "1";
      return str;
 } else if (key == 2) {
      String str = "2";
      return str;
 }

変数「str」のスコープがケース1に含まれていないのはなぜですか?

ケース1の宣言をスキップすると、変数「str」は宣言されません...

88

他の人が言ったことを繰り返します。各case句の変数のスコープは、switchステートメント全体に対応します。ただし、次のようにブレース付きのネストされたスコープをさらに作成できます。

int key = 2;
switch (key) {
case 1: {
    String str = "1";
    return str;
  }
case 2: {
    String str = "2";
    return str;
  }
}

str句のcaseという名前の変数が独自のスコープ内にあるため、結果のコードは正常にコンパイルされます。

161
Richard Cook

変数のスコープは、switchステートメント全体です。すべてのケースとデフォルト(含まれている場合)です。

他のオプションは次のとおりです...

オプション1:

int key = 2;
switch (key) {
case 1:
     return "1";
case 2:
     return "2";
}

オプション2:

int key = 2;
String str = null;
switch (key) {
case 1:
     str = "1";
     return str;
case 2:
     str = "2";
     return str;
}
9
Drew Wills

caseは、if/elseブロックのように、独自のローカルスコープを持つブロックであると仮定しているようです。そうではありません。

そうしないと、break内のcaseを忘れるという頻繁なtrapに陥ってしまうので、この概念的な間違いを修正することが重要です。

8
leonbloy

私はそれが有効な質問だと思います、そして、ケース文の範囲の仮定は避けられません。 Javaライターがこれを正しくないために調整します。

例えばif文はデフォルトで、caseの終わりがbreak文で明示的に閉じられている場合の問題よりもスコープの最初の行を取ります。したがって、ケース1の宣言は、ケース2で使用できず、並列スコープを持ちますが、ネストされていません。

2
Sachin Kumar

1つのswitchステートメントで複数のケースを実行できます。そう..

0
Stan Kurilin

変数のスコープは、スイッチの中括弧とifステートメントの間に存在します。コード1の例では、スイッチの中括弧は変数の両方の宣言を囲み、変数バインディングの名前がす​​でに作成されているため、コンパイラにエラーが発生します。

他の例では、両方の変数が独自の中括弧(スコープ)内で宣言されているため、問題ありません。

0
JB.

最初の場合、文字列宣言のスコープはswitchステートメント内にあるため、重複として表示されますが、2番目の場合、文字列はif/else条件内のスコープを制限する中括弧で囲まれているため、エラーではありません2番目のケース。

0
Emil