Ich habe eine verrückte Frage zu Java-Switches.
int key = 2;
switch (key) {
case 1:
int value = 1;
break;
case 2:
value = 2;
System.out.println(value);
break;
default:
break;
}
Szenario 1 - Wenn die key
beiden ist es erfolgreich den Wert als 2. drucken
Szenario 2 - Wenn ich Kommentar werde value = 2
in case 2:
es die kreischt sagen Die lokale Variable Wert nicht initialisiert worden sein .
Fragen:
Szenario 1: Wenn der Ausführungsfluss nicht zu case 1:
(wann key = 2
) wechselt, woher kennt er dann den Typ der Wertvariablen als int
?
Szenario 2: Wenn der Compiler den Typ der Wertvariablen als kennt int
, muss er auf den int value = 1;
Ausdruck in zugegriffen haben case 1:
(Deklaration und Initialisierung). Warum tut es sqawrk Wenn ich werde Kommentar value = 2
in case 2:
die sagen , die lokale Variable Wert kann nicht initialisiert wurden .
java
scope
initialization
switch-statement
declaration
namalfernandolk
quelle
quelle
Antworten:
Switch-Anweisungen sind im Hinblick auf den Umfang grundsätzlich ungerade. Aus Abschnitt 6.3 des JLS :
In Ihrem Fall
case 2
befindet es sich im selben Block wiecase 1
und wird danach angezeigt, obwohlcase 1
es niemals ausgeführt wird. Die lokale Variable befindet sich also im Gültigkeitsbereich und kann geschrieben werden, obwohl Sie die Deklaration logischerweise nie "ausführen". (Eine Deklaration ist nicht wirklich "ausführbar", obwohl die Initialisierung erfolgt.)Wenn Sie die
value = 2;
Zuweisung auskommentieren, weiß der Compiler immer noch, auf welche Variable Sie sich beziehen, aber Sie haben keinen Ausführungspfad durchlaufen, der ihr einen Wert zuweist. Aus diesem Grund erhalten Sie wie beim Versuch einen Fehler Lesen Sie jede andere nicht definitiv zugewiesene lokale Variable.Ich würde Ihnen dringend empfehlen, keine in anderen Fällen deklarierten lokalen Variablen zu verwenden - dies führt, wie Sie gesehen haben, zu höchst verwirrendem Code. Wenn ich lokale Variablen in switch-Anweisungen einführe (was ich selten versuche - Fälle sollten im Idealfall sehr kurz sein), bevorzuge ich normalerweise die Einführung eines neuen Bereichs:
Ich glaube das ist klarer.
quelle
Die Variable wurde deklariert (als int), aber nicht initialisiert (mit einem Anfangswert versehen). Denken Sie an die Linie:
Wie:
Der
int value
Teil teilt dem Compiler zur Kompilierungszeit mit, dass Sie eine Variable namens value haben, die ein int ist. Dervalue = 1
Teil initialisiert es, aber das passiert zur Laufzeit und überhaupt nicht, wenn dieser Zweig des Schalters nicht eingegeben wird.quelle
Von http://www.coderanch.com/t/447381/java-programmer-SCJP/certification/variable-initialization-within-case-block
quelle
Mit der Integration von JEP 325: Switch Expressions (Vorschau) in JDK-12-Builds für den frühen Zugriff. Es gibt bestimmte Änderungen, die aus Jons Antwort ersichtlich sind -
Umfang lokaler Variablen - Die lokalen Variablen in den Switch-Fällen können jetzt lokal für den Fall selbst anstatt für den gesamten Switch-Block sein . Ein Beispiel (ähnlich wie Jon es auch syntaktisch versucht hatte) unter Berücksichtigung der
Day
Enum-Klasse zur weiteren Erklärung:Switch-Ausdrücke - Wenn die Absicht besteht, einer Variablen einen Wert zuzuweisen und ihn dann zu verwenden, können die Switch-Ausdrücke einmal verwendet werden. z.B
quelle
Diese Erklärung könnte helfen.
quelle
Java-Spezifikation:
https://docs.oracle.com/javase/specs/jls/se12/html/jls-14.html#jls-14.11
https://docs.oracle.com/javase/specs/jls/se12/html/jls-14.html#jls-14.7
Beschriftete Aussagen:
Mit anderen Worten, Fall 1, Fall 2 sind Bezeichnungen innerhalb der switch-Anweisung. break and continue-Anweisungen können auf Beschriftungen angewendet werden.
Da Beschriftungen den Gültigkeitsbereich der Anweisung gemeinsam nutzen, teilen sich alle in Beschriftungen definierten Variablen den Gültigkeitsbereich der switch-Anweisung.
quelle