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.

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.