Integer i = ...
switch (i){
case null:
doSomething0();
break;
}
В приведенном выше коде я не могу использовать null в операторе switch case. Как я могу сделать это по-другому? Я не могу использовать, default
потому что тогда я хочу сделать что-то еще.
java
switch-statement
Hudi
источник
источник
Ответы:
Это невозможно с
switch
заявлением на Java. Проверьтеnull
доswitch
:Вы не можете использовать произвольные объекты в
switch
выражениях * . Причина , по которой компилятор не жалуется ,switch (i)
гдеi
этоInteger
происходит потому , что Java автоматически unboxesInteger
Аньint
. Как уже сказал Ассилиас, распаковка будет,NullPointerException
когдаi
естьnull
.* Начиная с Java 7 вы можете использовать
String
вswitch
заявлениях.Подробнее о
switch
(включая пример с нулевой переменной) в Oracle Docs - Switchисточник
null
не может быть действительным случаем при работе сString
иenum
типов. Возможно,enum
реализация основывается на вызовеordinal()
за кулисами (хотя, даже если это так, почему бы не считать,null
что он имеет «порядковый номер» -1?), АString
версия делает что-то с использованиемintern()
сравнения и сравнения указателей (или иным образом полагается на то, что строго требует разыменования объект)?источник
switch(i)
выдаст исключение NullPointerException, если оно естьnull
, потому что оно попытается распаковатьInteger
вint
. Так чтоcase null
, что оказывается незаконным, никогда бы не было достигнуто в любом случае.Вы должны проверить, что я не нуль перед
switch
утверждением.источник
Документы Java четко заявили, что:
Запрет на использование null в качестве метки переключателя не позволяет писать код, который никогда не будет выполнен. Если выражение-переключатель относится к ссылочному типу, такому как тип примитива в штучной упаковке или перечисление, произойдет ошибка времени выполнения, если выражение оценивается как ноль во время выполнения.
Перед выполнением оператора Swithch вы должны проверить наличие нуля.
См . Заявление о переключении
источник
Дано:
Для меня это обычно совпадает с таблицей поиска в базе данных (только для редко обновляемых таблиц).
Однако, когда я пытаюсь использовать
findByTypeId
в операторе switch (скорее всего, из пользовательского ввода) ...... как уже говорили другие, это приводит к NPE @
switch(personType) {
. Одним из обходных путей (т. Е. «Решением»), который я начал реализовывать, было добавлениеUNKNOWN(-1)
типа.Теперь вам не нужно выполнять нулевую проверку, когда она имеет значение, и вы можете выбирать, обрабатывать или не обрабатывать
UNKNOWN
типы. (ПРИМЕЧАНИЕ:-1
маловероятный идентификатор в бизнес-сценарии, но, очевидно, выберите то, что имеет смысл для вашего варианта использования).источник
UNKNOWN
лучшее решение по этому вопросу, которое я когда-либо видел, и завышенные нуль-проверки.Вы должны сделать
источник
Некоторые библиотеки пытаются предложить альтернативы встроенному
switch
выражению Java . Vavr является одним из них, они обобщают это для сопоставления с образцом.Вот пример из их документации :
Вы можете использовать любой предикат, но они предлагают многие из них из коробки, и
$(null)
это совершенно законно. Я считаю, что это более элегантное решение, чем альтернативы, но для этого требуется java8 и зависимость от библиотеки vavr ...источник
Вы также можете использовать
String.valueOf((Object) nullableString)
какисточник
источник
Ты не можешь Вы можете использовать примитивы (int, char, short, byte) и String (только строки в Java 7) в переключателе. примитивы не могут быть нулевыми.
Проверьте
i
в отдельном состоянии перед выключателем.источник
Просто подумайте, как может работать ПЕРЕКЛЮЧАТЕЛЬ,
источник
На основе ответа @tetsuo, с Java 8:
источник