Оператор switch-case в Java - Вопросы

Всего: 6 вопросов

1. 

Что такое оператор 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 и как его остановить?

Case-константы просматриваются сверху вниз, и первая совпавшая метка становится точкой входа. После неё выполняется соответствующий блок и все последующие блоки, пока не встретится break или не закончится switch — это и называется проваливанием (fall-through). Чтобы выйти из switch и выполнить только один блок, в конце каждой ветки ставят ключевое слово break. Если совпадений с case нет, точкой входа становится default, и проваливание продолжается в идущие за ним секции.

3. 

Для чего нужна секция default в switch и обязательна ли она?

Секция default обрабатывает все значения, которые не указаны явно ни в одной из меток case. Она может размещаться в любом месте switch, необязательно в конце. В классическом операторе switch default необязателен. А вот в выражении switch (Java 14) он обязателен, потому что выражение обязано вернуть значение для любого входа; исключение — если тип выражения enum и в case перечислены все его константы, тогда default можно опустить.

4. 

Что такое выражение 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 добавлено в Java 14 и возвращает значение из выражения switch: его используют в старом синтаксисе с двоеточием (case 3,4,5: yield "Spring";) и в стрелочном синтаксисе, когда нужно вернуть значение из блока в фигурных скобках. Отличие от break: break просто завершает оператор switch и ничего не возвращает, а yield завершает выражение switch и возвращает результат. При этом yieldзарезервированное, а не ключевое слово: вне контекста switch можно объявить переменную int yield = 6; без ошибки, тогда как имя case использовать как идентификатор нельзя.

6. 

Что произойдёт, если в switch передать переменную String со значением null?

Во время выполнения будет выброшено NullPointerException — и в классическом switch, и в выражении switch. Ошибки компиляции при этом нет, поэтому на таком примере часто ошибаются на собеседованиях. Поэтому перед switch переменную нужно проверять на null. Начиная с Java 21, благодаря сопоставлению с образцом (pattern matching), можно указать отдельную метку case null, которая позволяет обработать null без исключения.

Страница 1 из 1