Подтвердить что ты не робот

Почему оператор switch java не может обрабатывать значение null, поскольку в нем есть условие "по умолчанию"?

Почему оператор switch java не может обрабатывать значение null, поскольку в нем есть предложение по умолчанию?

Например, если у вас есть что-то вроде

   switch(value){
     case VAL1: do_something1(); break;
     case VAL2: do_something2(); break;
     default: do_something3(); 
   }

не должен "по умолчанию" иметь дело с любым другим значением, например null?

4b9b3361

Ответ 1

Как всегда, он в JLS:

14,11. Оператор switch

Все следующее должно быть истинным или произойдет ошибка компиляции:

  • ...
  • Нет метки переключателя null.

...
Запрет на использование null в качестве метки коммутатора не позволяет писать код, который никогда не может быть выполнен. Если выражение switch имеет ссылочный тип, то есть String или тип вложенного примитива или тип перечисления, тогда будет выполняться ошибка времени выполнения, если выражение оценивается как null во время выполнения. По мнению разработчиков языка программирования Java, это лучший результат, чем молча пропустить весь оператор switch или выбрать выполнение операторов (если они есть) после метки default (если есть).

Ответ 2

Короче говоря, этот выбор дизайна в духе Java.

Решение о выбросе NPE, когда выражение switch оценивается как null, совпадает с другими решениями, принятыми на Java, которые всегда предпочитают бросать исключение, чтобы молча обращаться с null "очевидным" способом. Как правило, общее правило заключается в том, что разработчики Java, если есть сомнения, выбирают вариант, который приводит к созданию более шаблонного кода.

Некоторые назвали бы это разочарование и неудачу (включая меня), где другие будут религиозно расходиться, утверждая, что это "более безопасное" решение.

Для другого разочаровывающего примера см. цикл enchanced for, который также выдает NPE, если коллекция null, вместо того, чтобы действовать так, как если бы коллекция была пуста. В JDK-библиотеке есть еще много примеров, где вызывающий должен глубже проверять все случаи краев, чтобы их можно было разрешить равномерно с "нормальными" случаями.

В качестве третьего печально известного примера, просто посмотрите на беспорядок, который "язык" проверенных исключений делает ваш код.

Ответ 3

Вы не можете SWITCH для строк и других типов данных, которые могут быть null. Это изменение было изменено в Java 7, чтобы разрешить строковые ключи.

См. этот вопрос для получения дополнительной информации:

Почему я не могу включить String?

Ответ 4

Это по определению. Я бы не потерял слишком много времени на этом, как в спецификациях.

С другой стороны, я нахожу это вполне практичным на самом деле, так как в случае null он не имеет примитивного типа, поэтому мы не можем точно знать, как правильно его обрабатывать.