10

Javaコンパイラは次のスイッチブロックをどのように処理しますか?'b'変数のスコープは何ですか?

'b'変数は、switchステートメントの最初のブランチでのみ宣言されていることに注意してください。2番目のブランチでも宣言しようとすると、「ローカル変数の重複」コンパイルエラーが発生します。

    int a = 3;
    switch( a ) {
    case 0:
        int b = 1;
        System.out.println("case 0: b = " + b);
        break;
    case 1:
        // the following line does not compile: b may not have been initialized
        // System.out.println("case 1 before: b = " + b);
        b = 2;
        System.out.println("case 1 after: b = " + b);
        break;
    default:
        b = 7;
        System.out.println("default: b = " + b);
    }

注:上記のコードは、Java1.6コンパイラーでコンパイルされます。

4

7 に答える 7

22

{スコープは、通常どおり、とで区切られ}ます。

于 2012-06-07T13:40:26.310 に答える
12

のスコープbはブロックです。すべてcaseのを含むブロックは1つだけです。bそのため、2番目に再宣言するとコンパイルエラーが発生しますcase

caseあなたはそれぞれを次のような独自のブロックで包むことができます

case 0:
   {
     int b = 1;
     ...
   }
case 1:
   {
     int b = 2;
     ...
   }

しかし、FindBugsやCheckStyleはそれについて文句を言うだろうと思います。

于 2012-06-07T13:40:27.777 に答える
4

のスコープは、宣言と区切り文字のb間のスイッチブロックです。}

int a = 3;

switch( a ) {
     case 0:
          int b = 1; //scope starts
          System.out.println("case 0: b = " + b);
          break;
     case 1:
          // the following line does not compile: b may not have been initialized
          // System.out.println("case 1 before: b = " + b);
          b = 2;
          System.out.println("case 1 after: b = " + b);
          break;
     default:
          b = 7;
          System.out.println("default: b = " + b);
}//scope ends

int bただし、内部を宣言すると、内部のcase 1:変数にアクセスできないことを知っておく必要があります。bcase 0:

Javaコメントで尋ねる質問に答えるには、次の簡単な例を確認してください。

int b;
if(true){
    b++; //The local variable b hast not been initialized
}

それが役に立てば幸い。

于 2012-06-07T13:41:43.397 に答える
4

ケースの周囲に{}を使用してスコープを定義できます。

int a = 3;
switch( a ) {
case 0: {
    int b = 1;
    System.out.println("case 0: b = " + b);
    break;
}
case 1: {
    // the following line does not compile: b may not have been initialized
    // System.out.println("case 1 before: b = " + b);
    int b = 2;
    System.out.println("case 1 after: b = " + b);
    break;
}
default: {
    int b = 7;
    System.out.println("default: b = " + b);
}
}
于 2015-11-30T13:25:26.497 に答える
1

コード内でaが0に等しくない場合、bは初期化されません。switchステートメントの前にbを定義する必要があります。

于 2012-06-07T13:42:53.280 に答える
0

ブロックにはローカルスコープがありませcaseん。これは一連の......ブロックではなくif、Javaは一連のsとして実装しelse ifます。elseGOTO

于 2012-06-07T13:41:39.217 に答える
0

ステートメントで定義された変数のスコープは、switch()とで囲まれた通常のブロックの場合と同じに{なり}ます。

したがって、ステートメントで定義されたすべての変数switch()は、一度定義されると、ブロック全体で表示されます。

于 2012-06-07T14:02:57.327 に答える