2015-02-26 1 views
6

Der folgende Java-Code ausgeführt wird, ohne Fehler in Java 1,7Wie werden Java-Bereichsdeklarationen in Switch-Case-Anweisungen verwendet?

public static void main(String[] args) { 
    int x = 5; 

    switch(x) { 
     case 4: 
      int y = 3423432; 
      break; 
     case 5: { 
      y = 33; 
     } 
    } 
} 

Wie funktioniert Java ausrechnen, dass y ein int ist, da die Deklaration nie ausgeführt wird. Wird die Deklaration von Variablen innerhalb einer case-Anweisung auf die switch-Anweisungsebene beschränkt, wenn geschweifte Klammern in einer case-Anweisung nicht verwendet werden?

+0

Ich glaube, die Variable wird im Rahmen der gesamten Schalter und nicht nur den Fall erklärt. Ich bin mir nicht sicher, aber ich denke, das ist was passiert. – StackFlowed

+1

ähnliche Frage wurde vor aufgeworfen: http://stackoverflow.com/questions/10810768/declaring-and-initializing-variables-within-java-switches – DonatasD

+1

Hoffnung Link für Ihre Frage beantworten http://stackoverflow.com/questions/3894119/variables-scope-in-a-switch-case –

Antwort

9

Deklarationen werden nicht ausgeführt - sie müssen nicht ausgeführt werden, sie teilen dem Compiler nur den Typ einer Variablen mit. (Ein Initializer würde laufen, aber das ist in Ordnung - Sie versuchen nicht, von der Variablen vor dem Zuweisen eines Werts zu lesen.)

Scoping innerhalb von Switch-Anweisungen ist definitiv seltsam, aber im Grunde ist die Variable in der ersten case deklariert noch im Umfang in der zweiten case.

Von section 6.3 of the JLS:

Der Gültigkeitsbereich einer lokalen Variablendeklaration in einem Block (§14.4) ist der Rest des Blockes, in dem die Erklärung erscheint, mit einem eigenen Initialisierer und einschließlich irgendwelchen weiteren zu Deklaratoren das Recht in der lokalen Variablendeklarationsanweisung.

Sofern Sie keine zusätzlichen Blöcke erstellen, ist die gesamte switch-Anweisung ein Block. Wenn Sie einen neuen Bereich für jeden Fall möchten, können Sie geschweifte Klammern verwenden:

case 1: { 
    int y = 7; 
    ... 
} 
case 2: { 
    int y = 5; 
    ... 
} 
1

Fall selbst deklariert Umfang nicht. Scope ist durch { und } begrenzt. Ihre Variable y ist also im äußeren Bereich (des gesamten Schalters) definiert und im inneren Bereich (von case 5) aktualisiert.

0

Wie ich weiß ist die komplette switch statement one scope. Ohne Pause; oder zurückkommen; Andere Switch-Fälle würden ebenfalls interpretiert. Wenn Sie also eine Variable innerhalb der switch-Anweisung definieren, ist diese im hole-switch-Fall sichtbar.