JavaRush /Курси /JAVA 25 SELF /Класичний switch: синтаксис, приклади

Класичний switch: синтаксис, приклади

JAVA 25 SELF
Рівень 10 , Лекція 3
Відкрита

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;
}

Тут: якщо month12, 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 — компілятор повідомить про помилку.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ