Rozdział 4 - Instrukcje warunkowe - Instrukcja switch

Poza instrukcją if, mamy do dyspozycji jeszcze inny rodzaj instrukcji warunkowej – jest to instrukcja switch. Jej składnia jest następująca:

switch (zmienna) {
  case staleWyrazenie:
    instrukcja;
    break;
  case staleWyrazenie2:
    instrukcja2;
    break;
  default:
    instrukcja3;
}

Instrukcja switch ma za zadanie przyrównanie wartość zmiennej zmienna do podanych stałych wartości – jeżeli wartość będzie pasować do którejś z porównywanych wartości, to wykonane zostaną instrukcje z nią powiązane. Zwróćmy uwagę, że instrukcje powiązane z daną sekcją case nie są objęte w klamry { }.

Jeżeli natomiast żadna z wartości nie będzie pasować, wykonane zostaną instrukcje z bloku default, który nie jest konieczny w instrukcji switch – można go pominąć.

W przykładzie powyżej pojawiło się nowe słowo kluczowe – break, o którym zaraz sobie opowiemy.

Spójrzmy na przykład użycia instrukcji switch:

Nazwa pliku: InstrukcjaSwitchDzienTygodnia.java
import java.util.Scanner;

public class InstrukcjaSwitchDzienTygodnia {
  public static void main(String[] args) {
    int dzienTygodnia;

    System.out.println("Podaj dzien tygodnia:");
    dzienTygodnia = getInt();

    switch (dzienTygodnia) {
      case 1:
        System.out.println("Poniedzialek.");
        break;
      case 2:
        System.out.println("Wtorek.");
        break;
      case 3:
        System.out.println("Sroda.");
        break;
      case 4:
        System.out.println("Czwartek.");
        break;
      case 5:
        System.out.println("Piatek.");
        break;
      case 6:
        System.out.println("Sobota.");
        break;
      case 7:
        System.out.println("Niedziela.");
        break;
      default:
        System.out.println("Nieznany dzien tygodnia!");
    }
  }

  public static int getInt() {
    return new Scanner(System.in).nextInt();
  }
}

W powyższym przykładzie pobieramy od użytkownika numer dnia tygodnia i wypisujemy jego nazwę przy użyciu instrukcji switch – porównujemy wartość zmiennej dzienTygodnia do liczb w kolejnych sekcjach case. Jeżeli żadna z wyszczególnionych liczb nie będzie zgadzała się z wartością zmiennej dzienTygodnia, wypisany zostanie komunikat z sekcji default.

Spójrzmy na dwa przykładowe wykonania powyższego programu:

Podaj dzien tygodnia: 2 Wtorek.
Podaj dzien tygodnia: -5 Nieznany dzien tygodnia!

Instrukcji switch można używać tylko z kilkoma typami, którymi są:

  • byte i Byte
  • short i Short
  • char i Character
  • int i Integer
  • String
  • enum

O typach Byte, Short, enum i pozostałych porozmawiamy w jednym z kolejnych rozdziałów.

Użycie break w instrukcji switch

Zadaniem słowa kluczowego break jest przerwanie wykonania kolejnych, następujących po nim operacji.

Wracając do przykładu programu z dniem tygodnia – jeżeli usunęlibyśmy słowa kluczowe break, a podalibyśmy z klawiatury np. dzień o numerze 3, to po wypisaniu na ekran informacji "Sroda" wypisane zostałyby kolejne linie z komunikatami "Czwartek", "Piatek" itd., łącznie z komunikatem wypisywanym pod sekcją default. Spójrzmy na poprzedni przykład bez instrukcji break:

Nazwa pliku: InstrukcjaSwitchDzienTygodniaBezBreak.java
import java.util.Scanner;

public class InstrukcjaSwitchDzienTygodniaBezBreak {
  public static void main(String[] args) {
    int dzienTygodnia;

    System.out.println("Podaj dzien tygoddnia:");
    dzienTygodnia = getInt();

    switch (dzienTygodnia) {
      case 1:
        System.out.println("Poniedzialek.");
      case 2:
        System.out.println("Wtorek.");
      case 3:
        System.out.println("Sroda.");
      case 4:
        System.out.println("Czwartek.");
      case 5:
        System.out.println("Piatek.");
      case 6:
        System.out.println("Sobota.");
      case 7:
        System.out.println("Niedziela.");
      default:
        System.out.println("Nieznany dzien tygodnia!");
    }
  }

  public static int getInt() {
    return new Scanner(System.in).nextInt();
  }
}

Spójrzmy jak zachowa się ta wersja programu na kilku przykładach:

Podaj dzien tygoddnia: 1 Poniedzialek. Wtorek. Sroda. Czwartek. Piatek. Sobota. Niedziela. Nieznany dzien tygodnia!
Podaj dzien tygoddnia: 3 Sroda. Czwartek. Piatek. Sobota. Niedziela. Nieznany dzien tygodnia!
Podaj dzien tygoddnia: -5 Nieznany dzien tygodnia!

Brak słowa kluczowego break powoduje, że po dopasowaniu wartości zmiennej dzienTygodnia do wartości z jednej z sekcji case, wykonywane są nie tylko powiązane z nią instrukcje, ale także instrukcje wszystkich sekcji case po niej następujące.

Użycie break nie jest wymagane, ale zazwyczaj jego brak świadczy o tym, że programista zapomniał go po prostu dopisać. Czasami opisane działanie instrukcji switch jest przydatne, ale niekiedy powoduje też trudne do wychwycenia błędy.

Komentarze (2):

  1. Od wersji Java 12 instrukcja switch ma nową wersję, która nie wymaga już używania "break". Zamiast ":" stosujemy "->". Taki zapis powoduje, że switch nie kontynuuje działania po spełnieniu pierwszego poprawnego "case".
    Kod jest czytelniejszy.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Nie musisz podawać swojego imienia, e-mailu, ani strony www, aby opublikować komentarz. Komentarze muszą zostać zatwierdzone, aby były widoczne na stronie.