Оператор switch-case в Java - Вопросы
Всего: 6 вопросов
1. Что такое оператор switch в Java и какие типы допустимы в его выражении?
Что такое оператор switch в Java и какие типы допустимы в его выражении?
switch — это условный оператор, который сравнивает значение выражения со списком значений в метках case и проверяет только на равенство (операторы >=, <= недопустимы). Выражение в switch должно иметь тип char, byte, short, int, их классы-обёртки (Character, Byte, Short, Integer), enum (с Java 6) или String (с Java 7). Использование long, float, double или boolean приводит к ошибке компиляции.
2. Что такое проваливание (fall-through) в классическом switch и как его остановить?
Что такое проваливание (fall-through) в классическом switch и как его остановить?
Case-константы просматриваются сверху вниз, и первая совпавшая метка становится точкой входа. После неё выполняется соответствующий блок и все последующие блоки, пока не встретится break или не закончится switch — это и называется проваливанием (fall-through). Чтобы выйти из switch и выполнить только один блок, в конце каждой ветки ставят ключевое слово break. Если совпадений с case нет, точкой входа становится default, и проваливание продолжается в идущие за ним секции.
3. Для чего нужна секция default в switch и обязательна ли она?
Для чего нужна секция default в switch и обязательна ли она?
Секция default обрабатывает все значения, которые не указаны явно ни в одной из меток case. Она может размещаться в любом месте switch, необязательно в конце. В классическом операторе switch default необязателен. А вот в выражении switch (Java 14) он обязателен, потому что выражение обязано вернуть значение для любого входа; исключение — если тип выражения enum и в case перечислены все его константы, тогда default можно опустить.
4. Что такое выражение switch (switch expression) в Java 14 и чем стрелочный синтаксис (->) отличается от классического?
Что такое выражение switch (switch expression) в Java 14 и чем стрелочный синтаксис (->) отличается от классического?
Выражение switch (появилось как preview в Java 12, стало стандартом в Java 14) может возвращать значение, а не только выполнять код: String season = switch (month) { ... };. При стрелочном синтаксисе вместо двоеточия используется стрелка case 1 -> ..., после которой идёт одно выражение или блок в фигурных скобках. Важные отличия: проваливания нет, поэтому break писать не нужно; несколько значений можно перечислять через запятую (case 12, 1, 2 ->). Код становится короче и читабельнее.
5. Зачем нужно слово yield в выражении switch и чем оно отличается от break? Является ли yield ключевым словом?
Зачем нужно слово yield в выражении switch и чем оно отличается от break? Является ли yield ключевым словом?
yield добавлено в Java 14 и возвращает значение из выражения switch: его используют в старом синтаксисе с двоеточием (case 3,4,5: yield "Spring";) и в стрелочном синтаксисе, когда нужно вернуть значение из блока в фигурных скобках. Отличие от break: break просто завершает оператор switch и ничего не возвращает, а yield завершает выражение switch и возвращает результат. При этом yield — зарезервированное, а не ключевое слово: вне контекста switch можно объявить переменную int yield = 6; без ошибки, тогда как имя case использовать как идентификатор нельзя.
6. Что произойдёт, если в switch передать переменную String со значением null?
Что произойдёт, если в switch передать переменную String со значением null?
Во время выполнения будет выброшено NullPointerException — и в классическом switch, и в выражении switch. Ошибки компиляции при этом нет, поэтому на таком примере часто ошибаются на собеседованиях. Поэтому перед switch переменную нужно проверять на null. Начиная с Java 21, благодаря сопоставлению с образцом (pattern matching), можно указать отдельную метку case null, которая позволяет обработать null без исключения.