Integer i = ...
switch (i){
case null:
doSomething0();
break;
}
W powyższym kodzie nie mogę użyć null w instrukcji case switch. Jak mogę to zrobić inaczej? Nie mogę korzystać default
, bo wtedy chcę zrobić coś innego.
java
switch-statement
Hudi
źródło
źródło
Odpowiedzi:
Nie jest to możliwe w przypadku
switch
instrukcji w Javie. Sprawdźnull
przedswitch
:Nie można używać dowolnych obiektów w
switch
instrukcjach * . Powodem, dla którego kompilator nie narzeka na to,switch (i)
gdziei
jest, jestInteger
to, że Java automatycznie rozpakowujeInteger
plik naint
. Jak już powiedzieli assyli, rozpakowanie rzuciNullPointerException
kiedyi
będzienull
.* Od wersji Java 7 można używać
String
wswitch
instrukcjach.Więcej informacji
switch
(w tym przykład ze zmienną null) w dokumentacji Oracle Docs - Switchźródło
null
nie może to być poprawny przypadek podczas pracy zString
ienum
typami. Być możeenum
implementacja polega na wywołaniuordinal()
za kulisami (chociaż mimo to, dlaczego nie traktować jejnull
jako „porządkowej” -1?), AString
wersja robi coś przy użyciuintern()
i porównuje wskaźniki (lub w inny sposób opiera się na czymś, co ściśle wymaga dereferencji obiekt)?źródło
switch(i)
wyrzuci NullPointerException, jeśli taknull
, ponieważ spróbuje rozpakować plikInteger
wint
. Tak więccase null
, co okazuje się nielegalne, i tak nigdy nie zostałoby osiągnięte.Musisz sprawdzić, czy i nie jest zerowy przed
switch
instrukcją.źródło
Dokumenty Java wyraźnie stwierdzają, że:
Zakaz używania wartości null jako etykiety przełącznika uniemożliwia pisanie kodu, którego nigdy nie można wykonać. Jeśli wyrażenie przełączające jest typu referencyjnego, takiego jak pierwotny element w pudełku lub wyliczenie, wystąpi błąd w czasie wykonywania, jeśli wyrażenie będzie miało wartość zerową w czasie wykonywania.
Przed wykonaniem instrukcji Swithch musisz sprawdzić, czy wartość jest pusta.
Zobacz instrukcję Switch
źródło
Dany:
Dla mnie zwykle jest to zgodne z tabelą przeglądową w bazie danych (tylko dla tabel rzadko aktualizowanych).
Jednak gdy próbuję użyć
findByTypeId
w instrukcji switch (najprawdopodobniej z danych wejściowych użytkownika) ...... jak stwierdzili inni, skutkuje to NPE @
switch(personType) {
. Jednym obejściem (tj. „Rozwiązaniem”), które zacząłem wdrażać, było dodanieUNKNOWN(-1)
typu.Teraz nie musisz sprawdzać wartości null tam, gdzie się liczy, i możesz wybrać obsługę
UNKNOWN
typów. (UWAGA:-1
jest mało prawdopodobnym identyfikatorem w scenariuszu biznesowym, ale oczywiście wybierz coś, co ma sens w twoim przypadku użycia).źródło
UNKNOWN
to najlepsze rozwiązanie w tym zakresie, jakie kiedykolwiek widziałem i które pokonało nullchecks.Musisz zrobić
źródło
Niektóre biblioteki próbują oferować alternatywy dla wbudowanej
switch
instrukcji Java . Vavr jest jednym z nich, uogólniają go do dopasowywania wzorców.Oto przykład z ich dokumentacji :
Możesz użyć dowolnego predykatu, ale oferuje on wiele z nich po wyjęciu z pudełka i
$(null)
jest całkowicie legalny. Uważam to za bardziej eleganckie rozwiązanie niż alternatywy, ale wymaga to java8 i zależności od biblioteki vavr ...źródło
Możesz także użyć
String.valueOf((Object) nullableString)
likeźródło
źródło
Nie możesz Możesz używać prymitywów (int, char, short, byte) i String (Strings in java 7 only) w przełączniku. prymitywy nie mogą mieć wartości zerowej.
Sprawdź
i
w osobnym stanie przed zmianą.źródło
Zastanów się, jak może działać SWITCH,
źródło
Na podstawie odpowiedzi @tetsuo z java 8:
źródło