2014-03-13 4 views
5

Ich bekam diesen Fehler mit Eclipse.Doppelte lokale Variable in switch-Anweisung

Doppelte lokale Variable Kap

Ich verstehe wirklich nicht, warum ich so einen Fehler. Dies war mein Code:

switch (frame) { // frame is an integer 
case 0: 
    Sprite cape = modules.get(Module.CAPE); 
    //cape.setRegion(region); 
    cape.translateY(+1); 
    break; 
case 1: 
    Sprite cape = modules.get(Module.CAPE); 
    //cape.setRegion(region); 
    cape.translateY(-1); 
    break; 
default: 
    throw new IllegalArgumentException(
      "Undefined frame number: " + frame); 
} 

Warum ist es nicht wahr, dass der Kap-Variable jeweils lokal, sondern auf die switch-Anweisung?

+0

Gute Antworten wurden bereits zur Verfügung gestellt worden, aber Um Ihre Frage strikt zu beantworten, überlegen Sie, wie sich der Code verhalten würde, wenn Sie die "Pause" in Fall 0 entfernen würden. – Grambot

Antwort

7

Warum ist es nicht wahr, dass die cape-Variable lokal für jeden Fall ist, sondern statt der switch-Anweisung?

weil die JLS says so

Der Gültigkeitsbereich einer lokalen Variablendeklaration in einem Block (§14.4) ist der Rest des Blocks, in dem die Erklärung erscheint, mit seinen eigenen Initialisierer Ausgangs und einschließlich weiterer Deklaratoren rechts in die lokale Variablendeklarationsanweisung.

Und über switch

Der Körper einer switch-Anweisung wird als Schalterblock bekannt.

Eine case definiert keinen Bereich. Es ist der switch Block, der einen neuen Bereich definiert.

0

Sie sollten cape Variable außerhalb switch Anweisung deklarieren:

Sprite cape; 
switch (frame) { 
    case 0: 
     cape = modules.get(Module.CAPE); 
     //cape.setRegion(region); 
     cape.translateY(+1); 
     break; 
    case 1: 
     cape = modules.get(Module.CAPE); 
     //cape.setRegion(region); 
     cape.translateY(-1); 
     break; 
    default: 
     throw new IllegalArgumentException(
      "Undefined frame number: " + frame); 
} 
+0

Das beantwortet meine Frage nicht. – Someone

+0

@Someone, weil alles innerhalb der Schalter zum selben Bereich gehören – nikis

+0

@Someone: Es tut, Sie erkennen es einfach nicht – Brian

7

Jeder Fall ist aus dem gleichen Block, insbesondere die {} für die switch Aussage. Dies ist derselbe Block, auch wenn verschiedene Fälle die gleiche Variable definieren.

Definieren Sie Ihre eigenen Blöcke für jeden Fall durch Zugabe von {} s:

case 0: 
    { 
    Sprite cape = modules.get(Module.CAPE); 
    //cape.setRegion(region); 
    cape.translateY(+1); 
    } 
    break; 
case 1: 
    { 
    Sprite cape = modules.get(Module.CAPE); 
    //cape.setRegion(region); 
    cape.translateY(-1); 
    } 
    break; 

Oder Sie können einfach erklären cape vor dem switch so ist es in ihrem Umfang dort, wo Sie die Referenz.

Sprite cape; 
switch (frame) { // frame is an integer 
case 0: 
    cape = modules.get(Module.CAPE); 

und in ähnlicher Weise für Fall 1.

+0

Alternativ könnten Sie "Sprite Umhang" außerhalb des Schalters definieren und dann in jedem Fall einstellen. – Scott

+0

@Scott Ja, ich kam dazu! – rgettman

+0

Wir sind alle zu schnell an unseren Fingern;) – Scott

5

Die ganze switch Anweisung ist ein Codeblock wie jedes andere.Aber Sie können Codeblöcke innerhalb Codeblöcke erstellen, so:

case 0: { 
    // code here 
} 
case 1: { 
    // other code here 
} 

(wenn die switch speziell behandelt wurden, in dieser Hinsicht könnten Sie nicht in der Lage sein zu tun, folgen Sie durch)

+0

+1 Curly Klammern definieren Umfang. Case Labels sind wie ein Goto. – Brian