Frage Variabler Geltungsbereich in einem Switch-Fall [Duplikat]


Diese Frage hat hier bereits eine Antwort:

Ich denke, ich verstehe nicht, wie das Oszilloskop in einem Switch-Fall funktioniert.

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 kommt es, dass der Gültigkeitsbereich der Variablen "str" ​​nicht in Fall 1 enthalten ist?

Wenn ich die Deklaration von Fall 1 überspringe, wird die Variable "str" ​​niemals deklariert ...


76
2017-10-08 20:36


Ursprung


Antworten:


Ich werde wiederholen, was andere gesagt haben: den Umfang der Variablen in jedem case Klausel entspricht dem Ganzen switch Erklärung. Sie können jedoch weitere verschachtelte Bereiche mit geschweiften Klammern wie folgt erstellen:

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

Der resultierende Code wird nun erfolgreich kompiliert, da die Variable benannt ist str in jedem case Klausel ist in ihrem eigenen Umfang.


140
2017-10-08 20:49



Der Umfang der Variablen ist das Ganze switch Anweisung - alle Fälle und Standard, falls enthalten.

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;
}

9
2017-10-08 20:40



Du scheinst das jeweils anzunehmen case ist ein Block mit einem eigenen lokalen Bereich, als ob / else blockiert. Es ist nicht.

Es ist wichtig, diesen konzeptuellen Fehler zu korrigieren, denn sonst endet man in der häufigen Falle des Vergessens break innerhalb der case


8
2017-10-08 20:43



Ich denke, es ist eine berechtigte Frage, und die Annahme des Umfangs für die Feststellung des Falles ist unvermeidlich. Wir haben uns darauf eingestellt, weil der Java-Autor 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.


2
2017-12-14 10:55



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


0
2017-10-08 20:40



Der Gültigkeitsbereich einer Variablen besteht zwischen den geschweiften Klammern der switch- 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, da beide Variablen innerhalb ihrer eigenen geschweiften Klammern (Scope) deklariert sind.


0
2017-10-08 20:41



Im ersten Fall liegt der Gültigkeitsbereich der String-Deklaration innerhalb der switch-Anweisung, daher wird sie doppelt angezeigt, während die Zeichenfolge in der zweiten in geschweiften Klammern eingeschlossen ist, was den Gültigkeitsbereich innerhalb der if / else-Bedingungen einschränkt der zweite Fall.


0
2017-10-08 20:43