3

各ケースで同じ名前の変数を作成できないのはなぜですか。たとえば、以下のコードから、すでに存在するcase 3と文句を言うでしょうが、なぜそうなるのでしょうか? 呼ばれたことはありませんし、これからも呼ばれることはありません。String nameCase 1

から定義を抽出したくありませんswitch-case。では、なぜifステートメントを使用して、それぞれのケースで同じ名前を定義できるのに、switch-caseそうしないのでしょうか?

以下は、switch ケースを使用した単純な Java コードです。

int type = 3;

switch (type) {
    case 1:
        String name = (String) respone.get("name");
        user.setName(name);
        break;
    case 2:
        String surname = (String) respone.get("surname");
        user.setSurname(surname);
        break;
    case 3:
        String name = (String) respone.get("name");
        user.clearName(name);
        break;
    default:
        ...
}
4

6 に答える 6

7

各 case ステートメントを異なるブロックに記述します。

switch (type) {
    case 1: {
        String name = (String) respone.get("name");
        user.setName(name);
        break;
    }
    case 2: {
        String surname = (String) respone.get("surname");
        user.setSurname(surname);
        break;
    }
    ...
}
于 2013-03-20T16:06:39.490 に答える
4

nameケースは概念的に同じブロックにあるため、既に存在します。case: は本質的にラベルであり、switchステートメントは単に適切なラベルにジャンプします。Java のラベルの詳細については、こちらを参照してください (switchステートメントに限定されません)。

これを確認するには、break ステートメントがない場合を想像してください。nameあるcase節で初期化して、次の節に進むことができます。これが問題になる場合は、各 case 句を個別の{}ブロックで囲みます。

于 2013-03-20T16:05:58.947 に答える
0

スイッチで中括弧なしで変数を宣言すると、そのスコープはスイッチ全体に残ります。

最初の switch ブロックまたは 2 番目の switch ブロックを宣言する場所は関係ありません。最初に宣言すると、その後にスイッチを介してアクセスできます。

同じ変数名が必要な場合は、変数のスコープがブロック内に残るため、中かっこまたはブロックを挿入することで実行できます。

switch (type) {
    case 1: {
        String name = (String) respone.get("name");
        user.setName(name);
        break;
    }
    case 2: {
        String surname = (String) respone.get("surname");
        user.setSurname(surname);
        break;
    }
    case 3: {
        String name = (String) respone.get("name");
        user.clearName(name);
        break;
    }
    default:
        ...
}
于 2013-03-20T16:07:39.920 に答える
0

相互に排他的であっても、同じSwitchブロック内に存在するためです。したがって、そのエラーを回避するために、各ケース句を別々のブロック内に記述できます。

于 2013-03-20T16:06:26.077 に答える
0

caseそれはあなたのスコープではないことに注意してください。ブロックは{ .. }

于 2013-03-20T16:06:42.077 に答える
0

スイッチ全体が 1 つのブロックに含まれています。各ケースを独自のブロックにラップできます。

case 1: {
    String name = (String) respone.get("name");
    user.setName(name);
    break;
  }
case 2: {
    String surname = (String) respone.get("surname");
    user.setSurname(surname);
    break;
  }
case 3: {
    String name = (String) respone.get("name");
    user.clearName(name);
    break;
  }
于 2013-03-20T16:06:56.357 に答える