Integer i = ...
switch (i){
case null:
doSomething0();
break;
}
Im obigen Code kann ich null in der switch case-Anweisung nicht verwenden. Wie kann ich das anders machen? Ich kann nicht verwenden, default
weil ich dann etwas anderes tun möchte.
java
switch-statement
hudi
quelle
quelle
Antworten:
Dies ist mit einer
switch
Anweisung in Java nicht möglich . Überprüfen Sienull
vorswitch
:Sie können keine beliebigen Objekte in
switch
Anweisungen * verwenden . Der Grund, warum sich der Compiler nicht darüber beschwert,switch (i)
woi
sich einInteger
befindet, liegt darin, dass Java dasInteger
zu einem automatisch entpacktint
. Wie assylias bereits gesagt, wird das Unboxing eines Wurf ,NullPointerException
wenni
istnull
.* Seit Java 7 können Sie
String
inswitch
Anweisungen verwenden.Weitere Informationen zu
switch
(einschließlich Beispiel mit Nullvariable) in Oracle Docs - Switchquelle
null
bei der Arbeit mitString
undenum
Typen kein gültiger Fall sein kann . Vielleichtenum
beruht die Implementierung darauf,ordinal()
hinter die Kulissen zu rufen (obwohl diesnull
dennoch eine Ordnungszahl von -1 ist?), Und dieString
Version verwendet etwas unter Verwendung einesintern()
Zeigervergleichs (oder basiert auf etwas, das eine Dereferenzierung von unbedingt erforderlich macht) Objekt)?quelle
switch(i)
wird eine NullPointerException auslösen, wenn i istnull
, weil es versucht, dieInteger
in eine zu entpackenint
. Alsocase null
, die illegal sein geschieht, würde sowieso nie erreicht worden sind.Sie müssen vor der
switch
Anweisung überprüfen, ob i nicht null ist .quelle
In Java-Dokumenten wurde klargestellt, dass:
Das Verbot, null als Switch-Label zu verwenden, verhindert, dass man Code schreibt, der niemals ausgeführt werden kann. Wenn der switch-Ausdruck von einem Referenztyp ist, z. B. ein primitiver Typ mit Box oder eine Aufzählung, tritt ein Laufzeitfehler auf, wenn der Ausdruck zur Laufzeit als null ausgewertet wird.
Sie müssen vor der Ausführung der Swithch-Anweisung auf null prüfen.
Siehe Die Switch-Anweisung
quelle
Gegeben:
Für mich stimmt dies normalerweise mit einer Nachschlagetabelle in einer Datenbank überein (nur für selten aktualisierte Tabellen).
Wenn ich jedoch versuche,
findByTypeId
eine switch-Anweisung zu verwenden (höchstwahrscheinlich aus Benutzereingaben) ...... wie andere angegeben haben, führt dies zu einem NPE @
switch(personType) {
. Eine Problemumgehung (dh "Lösung"), die ich implementiert habe, war das Hinzufügen einesUNKNOWN(-1)
Typs.Jetzt müssen Sie nicht mehr null prüfen, wo es darauf ankommt, und Sie können wählen, ob
UNKNOWN
Typen behandelt werden sollen oder nicht . (HINWEIS:-1
ist eine unwahrscheinliche Kennung in einem Geschäftsszenario, wählen Sie jedoch offensichtlich etwas, das für Ihren Anwendungsfall sinnvoll ist.)quelle
UNKNOWN
ist die beste Lösung dafür, die ich je gesehen habe, und überwinde Nullchecks.Du musst eine machen
quelle
Einige Bibliotheken versuchen, Alternativen zur integrierten Java-
switch
Anweisung anzubieten . Vavr ist einer von ihnen, sie verallgemeinern es auf Mustervergleich.Hier ist ein Beispiel aus ihrer Dokumentation :
Sie können jedes Prädikat verwenden, aber sie bieten viele von ihnen sofort an und
$(null)
sind vollkommen legal. Ich finde das eine elegantere Lösung als die Alternativen, aber dies erfordert Java8 und eine Abhängigkeit von der Vavr-Bibliothek ...quelle
Sie können auch
String.valueOf((Object) nullableString)
gerne verwendenquelle
quelle
Das kannst du nicht. Sie können Primitive (int, char, short, byte) und String (Strings nur in Java 7) in switch verwenden. Grundelemente können nicht null sein.
Überprüfen Sie
i
in einem separaten Zustand vor dem Einschalten.quelle
Überlegen Sie einfach, wie der SCHALTER funktionieren könnte.
quelle
Basierend auf der Antwort von @tetsuo mit Java 8:
quelle