2010-10-08 10 views
71

Ich glaube, ich verstehe nicht, wie das Oszilloskop in einem Switch-Fall funktioniert.Variabler Umfang in einem Switch-Gehäuse

Kann mir jemand erklären, warum der erste Code nicht kompiliert wird, aber der zweite?

Code 1:

int key = 2; 
switch (key) { 
case 1: 
     String str = "1"; 
     return str; 
case 2: 
     String str = "2"; // duplicate declaration of "str" according to Eclipse. 
     return str; 
} 

Code 2:

int key = 2; 
if (key == 1) { 
     String str = "1"; 
     return str; 
} else if (key == 2) { 
     String str = "2"; 
     return str; 
} 

Wie der Umfang der Variable "str" ​​kommen nicht innerhalb von Fall 1 enthält?

Wenn ich die Erklärung von Fall 1 die Variable „str“ überspringen wird nie erklärt ...

Antwort

137

Ich werde wiederholen, was andere gesagt haben: Der Gültigkeitsbereich der Variablen in jeder case Klausel entspricht der gesamten switch Aussage. Sie können, erstellen Sie jedoch weitere verschachtelte Bereiche mit Klammern wie folgt:

int key = 2; 
switch (key) { 
case 1: { 
    String str = "1"; 
    return str; 
    } 
case 2: { 
    String str = "2"; 
    return str; 
    } 
} 

Der resultierende Code erfolgreich, da die Variable str in jeder case-Klausel kompilieren in einem eigenen Bereich ist.

+6

Hören Sie sich diesen Typen an. Er hat recht. – John

+21

Korrigieren. Aber ich würde mich sehr über jeden Programmierer in meinem Team ärgern, der diese "Syntax" ohne einen sehr guten Grund verwendet. Es ist ein Rezept für Verwirrung und Fehler. Es verbirgt optisch die Tatsache, dass der erste Fallblock (wenn er nicht für die "Rückkehr" war) "auch nach der schließenden Klammer" weitergeht - und dazu beiträgt, die "Pause" zu vergessen. – leonbloy

+2

auch: Verwenden Sie "Break" für Wartbarkeit und Bug-Prävention! auch wenn nicht erforderlich. – worenga

9

Der Umfang der Variable ist die ganze switch Anweisung - alle Fälle und Standard, falls vorhanden.

Hier sind einige andere Optionen ...

Option 1:

int key = 2; 
switch (key) { 
case 1: 
    return "1"; 
case 2: 
    return "2"; 
} 

Option 2:

int key = 2; 
String str = null; 
switch (key) { 
case 1: 
    str = "1"; 
    return str; 
case 2: 
    str = "2"; 
    return str; 
} 
0

Mehrere Fälle können in einer switch-Anweisung ausgeführt werden. So ..

0

Der Umfang einer Variablen existiert zwischen den geschweiften Klammern des Schalters und if-Anweisungen. In Beispiel 1 enthalten die switch geschweiften Klammern beide Deklarationen der Variablen, die den Compiler zu einem Fehler veranlassen, da der Name der Variablenbindung bereits erfolgt ist.

In dem anderen Beispiel ist es in Ordnung, weil beide Variablen innerhalb ihrer eigenen geschweiften Klammern (Scope) deklariert sind.

8

Sie scheinen davon auszugehen, dass jeder case ein Block mit einem eigenen lokalen Gültigkeitsbereich ist, als ob/else blockiert. Es ist nicht.

Es ist wichtig, diesen konzeptionellen Fehler zu korrigieren, denn sonst werden Sie in der häufigen Fall zu tappen Ende der break innerhalb der case

0

Im ersten Fall vergessen, den Umfang der String Erklärung ist daher innerhalb der switch-Anweisung Es wird als Duplikat angezeigt, während in der Sekunde die Zeichenfolge in geschweiften Klammern eingeschlossen ist, was den Gültigkeitsbereich innerhalb der If/Else-Bedingungen einschränkt, daher handelt es sich im zweiten Fall nicht um einen Fehler.

2

Ich denke, es ist eine gültige Frage, und Bereich Annahme für Fallstatement ist unvermeidlich. Justieren uns darauf, weil Java-Writer dies nicht korrekt gemacht hat.

z.B.Wenn die Anweisung standardmäßig die erste Zeile in ihrem Gültigkeitsbereich einnimmt, dann ist das nicht der Fall, wenn das Ende der Schreibweise explizit durch die break-Anweisung geschlossen wird. Daher sollte die Deklaration in Fall 1: in Fall 2 nicht verfügbar sein und hat parallelen Umfang, aber nicht geschachtelt.

Verwandte Themen