1. Вступ
Уявіть: ви пишете програму для кавʼярні. Користувач може обрати напій, а вам потрібно відреагувати на цей вибір. Звісно, можна написати багато if-else if-else, але це виглядає громіздко:
if (choice == 1)
{
System.out.println("Ви обрали еспресо.");
}
else if (choice == 2)
{
System.out.println("Ви обрали капучино.");
}
else if (choice == 3)
{
System.out.println("Ви обрали лате.");
}
else
{
System.out.println("Такого напою немає.");
}
Справді, це громіздко. А що, як варіантів було б 10 чи 20? Тут виручає оператор switch, який дозволяє елегантно й компактно організувати вибір із багатьох варіантів за значенням змінної.
Синтаксис класичного switch
Синтаксис switch у Java виглядає так:
switch (вираз)
{
case значення1:
// дії, якщо вираз == значення1
break;
case значення2:
// дії, якщо вираз == значення2
break;
...
default:
// дії, якщо не збіглося з жодним case
break;
}
switch у Java
Ключові елементи:
- switch (вираз) — вираз, результат якого порівнюється з кожним case.
- case значення: — це варіант, із яким порівнюється вираз.
- break; — завершує виконання блоку switch (інакше — «провалювання» у наступний case).
- default: — виконується, якщо не збіглося з жодним із case.
2. Приклади використання switch
Приклад 1. Класика жанру: вибір напою
Реалізуймо меню для кавʼярні:
import java.util.Scanner;
public class CoffeeShop
{
public static void main(String[] args)
{
Scanner console = new Scanner(System.in);
System.out.println("Оберіть напій:");
System.out.println("1 - Еспресо");
System.out.println("2 - Капучино");
System.out.println("3 - Лате");
int choice = console.nextInt();
switch (choice)
{
case 1:
System.out.println("Ви обрали еспресо.");
break;
case 2:
System.out.println("Ви обрали капучино.");
break;
case 3:
System.out.println("Ви обрали лате.");
break;
default:
System.out.println("Такого напою немає.");
break;
}
}
}
Що відбувається:
- Користувач вводить номер напою.
- Значення змінної choice порівнюється з кожним case.
- Якщо збіглося — виконується відповідний блок, після цього break завершує виконання блоку switch.
- Якщо не збіглося з жодним — виконується default.
Приклад 2: Перемикач для рядків
Не всі типи можна використовувати в switch, проте рядки підтримуються. Це зручно для командних меню:
import java.util.Scanner;
public class CommandMenu
{
public static void main(String[] args)
{
Scanner console = new Scanner(System.in);
System.out.println("Введіть команду (start, stop, pause):");
String command = console.nextLine();
switch (command)
{
case "start":
System.out.println("Запуск програми!");
break;
case "stop":
System.out.println("Зупинка програми.");
break;
case "pause":
System.out.println("Пауза.");
break;
default:
System.out.println("Невідома команда.");
break;
}
}
}
Зверніть увагу: порівняння рядків у switch — чутливе до регістру! "Start" і "start" — різні рядки.
3. Які типи підтримує класичний switch?
У класичному switch можна використовувати лише певні типи:
- Примітивні цілочисельні типи: byte, short, char, int
- Перелічувані типи: enum (про них поговоримо на наступній лекції)
- Рядки: String — порівнюються з урахуванням регістру
Не можна використовувати: boolean, float, double, масиви, довільні обʼєкти класів (окрім enum і String).
Приклад із char
char grade = 'B';
switch (grade)
{
case 'A':
System.out.println("Відмінно!");
break;
case 'B':
System.out.println("Добре.");
break;
case 'C':
System.out.println("Задовільно.");
break;
default:
System.out.println("Спробуйте ще раз.");
break;
}
4. Обовʼязковість break: що станеться, якщо його забути?
Найчастіша помилка новачків — забути break;. Подивімося, що відбудеться:
int day = 2;
switch (day)
{
case 1:
System.out.println("Понеділок");
break;
case 2:
System.out.println("Вівторок");
case 3:
System.out.println("Середа");
break;
default:
System.out.println("Невідомий день");
break;
}
Результат:
Вівторок
Середа
Чому? Тому що після case 2 немає break, і виконання «провалюється» в наступний case (це називається fall-through). Іноді це корисно, але частіше — джерело помилок.
5. Групування case: коли кілька варіантів поводяться однаково
Якщо для кількох значень потрібна однакова поведінка, можна перелічити їх підряд:
int month = 1;
switch (month)
{
case 12:
case 1:
case 2:
System.out.println("Зима");
break;
case 3:
case 4:
case 5:
System.out.println("Весна");
break;
case 6:
case 7:
case 8:
System.out.println("Літо");
break;
case 9:
case 10:
case 11:
System.out.println("Осінь");
break;
default:
System.out.println("Невідомий місяць");
break;
}
Тут: якщо month — 12, 1 або 2, програма виведе "Зима".
6. Порівняння: switch і if-else
| Сценарій | if-else | switch |
|---|---|---|
| Багато варіантів | Довгий ланцюжок, не такий зручний для читання | Коротко: усі варіанти видно одразу |
| Порівняння діапазонів | Можна (if (x > 5 && x < 10)) | Ні; лише конкретні значення |
| Підтримувані типи | Будь-які | Лише певні (див. вище) |
| Пастка з break | Ні | Так: треба стежити за break |
7. Типові помилки під час роботи зі switch
Помилка № 1: забули break
Найчастіша причина помилок: забули break — і код виконує не той case, який ви очікували.
Помилка № 2: непідтримуваний тип
Ви намагаєтеся використати double, float або boolean — компілятор повідомить про помилку.
Помилка № 3: рядки з різним регістром
Користувач ввів "Start", а ви очікуєте "start" — switch не спрацює. Краще заздалегідь звести рядки до одного регістру:
switch (command.toLowerCase())
{
case "start":
// ...
}
Помилка № 4: змінна в case, а не константа
У case дозволені лише константи. Якщо використати змінну — виникне помилка компіляції.
Помилка № 5: дубльовані case
Два однакові значення case — компілятор повідомить про помилку.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ