Wie verwende ich null im Schalter?
Integer i = ...
switch (i){
case null:
doSomething0();
break;
}
In den obigen code kann ich nicht verwenden Sie null-in switch-case-Anweisung. Wie kann ich das anders???
Ich kann nicht mit default
denn dann möchte ich etwas anderes zu tun.
Kommentar zu dem Problem
bevor Sie wechseln, überprüfen Sie für die null-Bedingung if(i==null) {//dosomething}
Würde dies tatsächlich machen die Schalter sinnvoll. Weitere pattern-matching-Sprachen funktionieren auf diese Weise.
InformationsquelleAutor der Frage hudi | 2012-04-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist nicht möglich, mit einer
switch
- Anweisung in Java. Überprüfen Sie fürnull
vor derswitch
:Können Sie nicht verwenden, beliebige Objekte in
switch
Anweisungen*. Der Grund dafür, dass der compiler nicht meckernswitch (i)
woi
ist einInteger
ist, da Java-auto-unboxes dieInteger
zu einemint
. Als assylias schon gesagt, das unboxing werfen wirdNullPointerException
wenni
istnull
.* Seit Java 7 können Sie
String
imswitch
Aussagen.Mehr über
switch
(einschließlich Beispiel mit null-variable) in Oracle-Docs - SchalterInformationsquelleAutor der Antwort Jesper
InformationsquelleAutor der Antwort tetsuo
switch(i)
wirft eine NullPointerException, wenn ichnull
, weil es versuchen wird unbox dasInteger
in eineint
. Socase null
,, die passiert werden illegale, würde nie erreicht haben, sowieso.Müssen Sie überprüfen, dass ich nicht null ist, bevor die
switch
- Anweisung.InformationsquelleAutor der Antwort assylias
Java-docs deutlich gesagt:
Das Verbot gegen die Verwendung von null als ein switch-label verhindert, dass man vom schreiben von code, der niemals ausgeführt werden. Wenn der switch-Ausdruck wird eine Referenz geben, wie eine Box-primitive-Typ oder ein enum, ein Laufzeitfehler wird auftreten, wenn der Ausdruck null zur Laufzeit.
Müssen Sie haben, um zu überprüfen, für die null vor der Swithch der Ausführung der Anweisung.
Sehen Die Switch-Anweisung
InformationsquelleAutor der Antwort Shehzad
Gegeben:
Für mich, dies in der Regel richtet mit einer look-up-Tabelle in einer Datenbank (für selten aktualisierte Tabellen).
Jedoch, wenn ich versuche, mit
findByTypeId
in einer switch-Anweisung (aus, wahrscheinlich, Benutzereingaben)......wie andere bereits gesagt haben, dies führt zu einer NPE @
switch(personType) {
. Ein work-around (d.h., "Lösung") ich begann mit der Umsetzung wurde das hinzufügen einesUNKNOWN(-1)
geben.Nun, Sie nicht zu tun haben, null-Prüfung, wo es zählt, und Sie können, oder nicht, Griff
UNKNOWN
Arten. (HINWEIS:-1
ist ein unwahrscheinlich Bezeichner in einem business-Szenario, aber natürlich wählen Sie etwas, das Sinn macht für Ihre use-case).InformationsquelleAutor der Antwort Beez
Haben Sie, um eine
InformationsquelleAutor der Antwort Kai
Einfache if-Anweisung im switch:
Oder wenn Sie mit dem Schalter auf der Schnur:
Letzte Lösung ohne null-Prüfung:
Ja!!! Ich Liebe das verwenden von TRY /CATCH oder THROW new Exception als IF /ELSE-Ersatz 🙂
Bearbeiten - in der Antwort:
Für Ihre Letzte Lösung: nicht das Programm Python in Java. – glglgl Feb 15 14:33
...Ich wollte sagen: In Python Ausnahmen sind als ein normaler flow control-Methode (EAFP). In Java werden Sie als wie das, was Ihr name schon sagt: Ausnahmen. Sie sind ziemlich teuer und sollten mit Vorsicht verwendet werden. Anders als in Python, verwenden Sie TRY /CATCH oder THROW new Exception als IF /ELSE-Ersatz ist nicht gut hier. – glglgl
Programmieren mit Ausnahmen
Wenn ein Programm auf einen außergewöhnlichen Zustand und hat keine Möglichkeit der Handhabung sofort kann das Programm eine exception werfen. In einigen Fällen ist es sinnvoll, eine exception werfen, die Zugehörigkeit zu einer Java vordefinierten Klassen, wie z.B. IllegalArgumentException oder IOException. Allerdings, wenn es keine standard-Klasse, die angemessen repräsentiert den außergewöhnlichen Zustand, kann der Programmierer definieren eine neue exception-Klasse. Die neue Klasse muss, erweitern Sie die standard-Klasse Throwable oder einer Ihrer Unterklassen. Im Allgemeinen, wenn der Programmierer will nicht, erfordern obligatorisch exception-handling, die neue Klasse erweitern RuntimeException (oder einer Ihrer Unterklassen). Zum erstellen einer neuen geprüfte exception-Klasse, die erfordert zwingend Behandlung, die Programmierer erweitern zu können, eine der anderen Unterklassen von Exception oder erweitern zu können, Ausnahme selbst.
Hier zum Beispiel ist eine Klasse, die Sie erweitert Ausnahme, und erfordert daher obligatorisch exception-handling, wenn es verwendet wird:
^1 eine Stelle, an der Korrektheit und Robustheit sind wichtig-und besonders schwierig-ist in der Verarbeitung von input-Daten, ob die Daten durch den Benutzer eingegebene, aus einer Datei gelesen, empfangen oder über ein Netzwerk.
noch besser, hier kann ich gab Sie ein Beispiel für android-app:
InformationsquelleAutor der Antwort ceph3us
Einige Bibliotheken versuchen, bieten alternativen zu den eingebauten java -
switch
- Anweisung. Vavr ist einer von Ihnen, Sie verallgemeinern es auf pattern-matching.Hier ist ein Beispiel aus Ihre Dokumentation:
Können Sie jedes Prädikat, aber Sie bieten viele von Ihnen aus der box, und
$(null)
ist vollkommen legal. Ich finde das eine elegantere Lösung als die alternativen, aber das erfordert java8 und eine Abhängigkeit der vavr Bibliothek...InformationsquelleAutor der Antwort Emmanuel Touzery
Können Sie nicht. Sie können primitive (int, char, short, byte) und Strings (Zeichenketten in java 7 nur) - in Schalter. primitive können nicht null sein.
Überprüfen Sie
i
im getrennten Zustand vor dem Schalter.InformationsquelleAutor der Antwort Nikita Beloglazov
switch (String.valueOf(value)){
Fall "null":
Standard:
}
InformationsquelleAutor der Antwort l0v3
Können Sie auch
String.valueOf((Object) nullableString)
wie
InformationsquelleAutor der Antwort oikonomopo