4

次のコードでは:

private static void example() {
    String inputString = "test";
    switch (inputString) {
        case "test":
            String outputString = "The string said test";
        case "not test":
            String outputString = "The string did not say test";
    }
    /*Do stuff with ouputString*/        
}

Eclipse はCase "not test"、エラーの後の行を強調表示しますDuplicate local variable outputString。ただし、これらはステートメントの別々のブランチにあるため、switch一度に 1 つしか有効にできないため、実際には競合していません。

明らかに、この場合、宣言をステートメントのoutputString外に移動することで問題を回避できます。switchただし、より複雑なプログラムでは、解決策はそれほど単純ではない場合があります。

これは単に、不十分なプログラミング手法を防ぐために Eclipse によってスローされたエラーですか、それとも実際の Java エラーですか?

私はJavaに非常に慣れていないので、これが初心者の質問である場合はお詫びします-「ローカル変数Javaの複製」についてグーグルで検索しましたが、これまでのところ、問題を解決するための助けを求めている人だけが見つかりました(通常の解決策は、変数の 1 つの名前を変更することです)、問題自体の議論ではありません。

4

2 に答える 2

5

java の switch ステートメントの各ケースにおける変数のスコープは、switch ステートメント全体です。

次のように中括弧を追加することで、さらにネストされたスコープを作成できます。

 switch (inputString) {
        case "test": {
            String outputString = "The string said test";
            break;
        }
        case "not test": {
            String outputString = "The string did not say test";
            break;
        }
    }
于 2012-11-18T16:25:46.493 に答える
4

case各ラベルが個別のスコープを作成すると想定していますが、そうではありません。ここでのスコープはスイッチブロックであるため、スコープ内で同じ名前の2つの変数を実際に宣言しました。

ケースラベルごとに新しいスコープを導入できます。例:

switch (inputString) {
    case "test": {
        String outputString = "The string said test";
        break;
    }
    case "not test": {
        String outputString = "The string did not say test";
        break;
   }
}

または、スイッチがすでに大きい場合は、ケースごとに、そこで行うすべての作業をラップするメソッドを作成する必要があります。

于 2012-11-18T16:27:09.767 に答える