Elementor Header #8

51. Конструкция Switch

1. Введение

Конструкция switch в Java используется для проверки значения переменной и выполнения определённого блока кода в зависимости от этого значения. Она является альтернативой множественным операторам if-else и упрощает код, когда нужно выполнить разные действия в зависимости от конкретных значений переменной.

2. Основы конструкции switch

Конструкция switch работает с типами данных byte, short, int, char, перечислениями (enum), строками (String), и классами-оболочками (Byte, Short, Integer, Character).

Синтаксис:

				
					switch (выражение) {
    case значение1:
        // Код, выполняемый, если выражение равно значение1
        break;
    case значение2:
        // Код, выполняемый, если выражение равно значение2
        break;
    // можно добавлять больше case
    default:
        // Код, выполняемый, если ни одно из значений не совпадает с выражением
}

				
			
  • выражение — переменная или результат выражения, которое нужно проверить.
  • case значение — конкретное значение, с которым сравнивается выражение.
  • break — оператор, который завершает выполнение switch после выполнения кода для соответствующего случая.
  • default — необязательный блок, выполняющийся, если ни одно из значений не совпадает.

3. Пример использования switch

Рассмотрим пример использования switch, где программа выводит день недели по его номеру.

Пример:

				
					public class Main {
    public static void main(String[] args) {
        int day = 3;
        String dayName;

        switch (day) {
            case 1:
                dayName = "Monday";
                break;
            case 2:
                dayName = "Tuesday";
                break;
            case 3:
                dayName = "Wednesday";
                break;
            case 4:
                dayName = "Thursday";
                break;
            case 5:
                dayName = "Friday";
                break;
            case 6:
                dayName = "Saturday";
                break;
            case 7:
                dayName = "Sunday";
                break;
            default:
                dayName = "Invalid day";
                break;
        }

        System.out.println("Day: " + dayName);
    }
}

				
			

В этом примере значение переменной day сравнивается с числами от 1 до 7, и программа выводит название дня недели. Если значение переменной не совпадает ни с одним из этих значений, срабатывает блок default, который выводит сообщение «Invalid day».

4. Использование строки в switch

С Java 7 конструкция switch поддерживает сравнение строковых значений (String).

Пример:

				
					public class Main {
    public static void main(String[] args) {
        String fruit = "Apple";

        switch (fruit) {
            case "Apple":
                System.out.println("You selected Apple.");
                break;
            case "Banana":
                System.out.println("You selected Banana.");
                break;
            case "Orange":
                System.out.println("You selected Orange.");
                break;
            default:
                System.out.println("Unknown fruit.");
                break;
        }
    }
}

				
			

Здесь программа сравнивает строковое значение fruit с возможными вариантами и выводит соответствующее сообщение.

5. Падение через case (fall-through)

Если после блока case не используется оператор break, выполнение кода продолжится в следующем блоке case. Это называется «падение через case» (fall-through).

Пример:

				
					int month = 5;
int days;

switch (month) {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        days = 31;
        break;
    case 4:
    case 6:
    case 9:
    case 11:
        days = 30;
        break;
    case 2:
        days = 28;
        break;
    default:
        days = 0; // Неизвестный месяц
        break;
}

System.out.println("Number of days: " + days);

				
			

В этом примере, если month равно 5, программа выполнит код days = 31;, так как все случаи для месяцев с 31 днем объединены, и для них выполняется один и тот же код.

6. Распространённые ошибки при использовании switch

6.1 Ошибка: Отсутствие оператора break

Если забыть вставить break после блока case, программа продолжит выполнение следующих блоков, что может привести к непредсказуемому поведению.

Пример ошибки:

				
					int number = 2;

switch (number) {
    case 1:
        System.out.println("One");
    case 2:
        System.out.println("Two");
    case 3:
        System.out.println("Three");
    default:
        System.out.println("Unknown");
}

				
			

Результат будет:

				
					Two
Three
Unknown

				
			

Здесь программа после выполнения блока case 2: продолжила выполнение блоков case 3: и default из-за отсутствия break.

6.2 Ошибка: Несовместимые типы данных

Конструкция switch работает только с ограниченным набором типов данных. Попытка использовать тип данных, не поддерживаемый switch, приведёт к ошибке компиляции.

Пример ошибки:

				
					double value = 3.14;

switch (value) {
    case 3.14:
        System.out.println("Pi");
        break;
    default:
        System.out.println("Unknown");
}

				
			

Здесь произойдет ошибка компиляции, так как тип double не поддерживается в конструкции switch.

Заключение

Конструкция switch является полезным инструментом для обработки ситуаций, когда нужно проверить переменную на несколько возможных значений и выполнить соответствующий код. Она делает код более читабельным и понятным, чем множественные if-else конструкции, особенно когда количество вариантов велико.

7. Тестовое задание

  1. Напишите программу, которая на основе номера месяца (от 1 до 12) определяет, к какому времени года он относится:

    • Декабрь, Январь, Февраль — Зима.
    • Март, Апрель, Май — Весна.
    • Июнь, Июль, Август — Лето.
    • Сентябрь, Октябрь, Ноябрь — Осень.
  2. Допишите программу, которая определяет вид транспортного средства по числу колёс:

    • 2 колеса — Мотоцикл.
    • 4 колеса — Автомобиль.
    • 6 колёс — Грузовик.
    • Иное количество колёс — «Unknown vehicle».

Пример решения:

				
					public class Main {
    public static void main(String[] args) {
        int month = 4;
        String season;

        switch (month) {
            case 12:
            case 1:
            case 2:
                season = "Winter";
                break;
            case 3:
            case 4:
            case 5:
                season = "Spring";
                break;
            case 6:
            case 7:
            case 8:
                season = "Summer";
                break;
            case 9:
            case 10:
            case 11:
                season = "Autumn";
                break;
            default:
                season = "Unknown";
                break;
        }

        System.out.println("Season: " + season);

        int wheels = 4;
        String vehicle;

        switch (wheels) {
            case 2:
                vehicle = "Motorcycle";
                break;
            case 4:
                vehicle = "Car";
                break;
            case 6:
                vehicle = "Truck";
                break;
            default:
                vehicle = "Unknown vehicle";
                break;
        }

        System.out.println("Vehicle: " + vehicle);
    }
}

				
			

Проверьте свою программу, чтобы убедиться, что она правильно выполняет все операции и обрабатывает возможные ошибки.

logo