Rozdział 5 - Pętle - Instrukcje break oraz continue

Czasem potrzebujemy przerwać działanie pętli – wyobraźmy sobie sytuację, gdy w ciągu liczb szukamy konkretnej liczby. Gdy ją znajdziemy, nie ma już potrzeby do kontynuowania działania pętli. W tym celu możemy skorzystać z instrukcji break, która powoduje natychmiastowe przerwanie pętli – żadne instrukcje zawarte w ciele pętli (oraz instrukcji kroku w pętli for) nie będą już wykonywane.

Słowo kluczowe break poznaliśmy już przy okazji omawiania instrukcji switch w rozdziale czwartym. Możemy je stosować w każdym z poznanych rodzajów pętli: while, do..while, oraz for, a także w pętli for-each, którą poznamy w rozdziale o tablicach.

Może się też zdarzyć, że będziemy potrzebowali przerwać aktualną iterację pętli i przejść do kolejnej – do tego celu służy instrukcja continue.

Instrukcja break

Spójrzmy najpierw na przykład działania instrukcji break:

Nazwa pliku: PrzykladBreakFor.java
public class PrzykladBreakFor {
  public static void main(String[] args) {
    for (int i = 0; i < 1000; i++) {
      System.out.println(i);

      if (i >= 3) {
        break;
      }

      System.out.println("Nadal dzialam.");
    }
  }
}

Pętla ma wypisać liczby od 0 do 999, ale w instrukcji if wewnątrz pętli sprawdzamy wartość zmiennej i – jeżeli jest większa bądź równa 3, wykonana zostanie instrukcja break. Spójrzmy, co zostanie wypisane w ramach działania tego programu:

0 Nadal dzialam. 1 Nadal dzialam. 2 Nadal dzialam. 3

Zauważmy, że gdy zmienna i ma wartość 3 i zostaje wykonana instrukcja break, to komunikat "Nadal dzialam." nie zostaje wypisany – działanie pętli jest natychmiast przerywane i wszelkie instrukcje, które znajdują się za instrukcją break w ciele pętli, zostają pominięte.

W kolejnym przykładzie, który korzysta z nieskończonej pętli while, sumujemy liczby podawane przez użytkownika, dopóki użytkownik nie poda liczby 0:

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

public class SumujLiczbyWhileBreak {
  public static void main(String[] args) {
    System.out.println(
        "Podaj liczby do zsumowania lub 0, aby zakonczyc."
    );

    int suma = 0;
    int liczba;

    while (true) {
      System.out.print("Podaj liczbe: ");
      liczba = getInt();

      if (liczba == 0) {
        break;
      }

      suma += liczba;
    }

    System.out.println("Suma podanych przez Ciebie liczb to " + suma);
  }

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

Powyższy program najpierw informuje użytkownika, że zsumuje podane przez niego liczby, a zakończy swoją pracę, gdy użytkownik poda liczbę 0.

Następnie, w nieskończonej pętli w każdej jej iteracji pobieramy od użytkownika liczbę, po czym:

  • jeżeli liczba jest równa 0, to przerywamy działanie pętli za pomocą instrukcji break,
  • w przeciwnym razie, dodajemy do zmiennej suma wczytaną liczbę.

Gdy użytkownik poda 0, pętla się zakończy, a na końcu programu wypisana zostanie suma wszystkich wczytanych liczb.

Spójrzmy na trzy uruchomienia powyższego programu:

Podaj liczby do zsumowania lub 0, aby zakonczyc. Podaj liczbe: 10 Podaj liczbe: 999 Podaj liczbe: -20 Podaj liczbe: 0 Suma podanych przez Ciebie liczb to 989
Podaj liczby do zsumowania lub 0, aby zakonczyc. Podaj liczbe: -1 Podaj liczbe: 1 Podaj liczbe: 0 Suma podanych przez Ciebie liczb to 0
Podaj liczby do zsumowania lub 0, aby zakonczyc. Podaj liczbe: 0 Suma podanych przez Ciebie liczb to 0

Program poprawnie sumuje podawane liczby. Gdy podana zostanie liczba 0, pętla, w której pobieramy i sumuje liczby kończy działanie i przechodzimy wykonywania kodu programu za pętlą – w naszym przypadku, jest to tylko jedna instrukcja – wypisanie policzonej sumy na ekran.

Instrukcja continue

Instrukcja continue jest podobna do instrukcji break z tym, że nie przerywa działania całej pętli, lecz tylko jej aktualną iterację. Wykonanie programu przechodzi wtedy albo do sprawdzenia warunku pętli (pętle while, do..while, oraz for-each), lub do instrukcji kroku i sprawdzenia warunku pętli (pętla for).

Spójrzmy na prosty przykład – poniższy program używa słowa kluczowego continue, gdy wartość zmiennej używanej w pętli jest parzysta:

Nazwa pliku: WypiszLiczbyContinue.java
public class WypiszLiczbyContinue {
  public static void main(String[] args) {
    for (int i = 1; i <= 10; i++) {
      if (i % 2 == 0) {
        continue;
      }

      System.out.println(i);
    }
  }
}

Spójrzmy na wynik uruchomienia tego programu:

1 3 5 7 9

Program wypisuje tylko liczby nieparzyste. Jeżeli liczba jest parzysta, to spełniony jest warunek i % 2 == 0 (reszta z dzielenia dla liczb parzystych wynosi 0), więc zostaje wykonana instrukcja continue – aktualna iteracja pętli natychmiast się kończy i wszelkie dalsze operacje w ciele pętli zostają pominięte. Wykonana zostaje instrukcja kroku (zwiększenie i o 1 za pomocą i++), po czym sprawdzony zostaje warunek pętli i jeżeli nadal jest spełniony, rozpoczyna się kolejna iteracja pętli.

Spójrzmy na inny przykład – poniższy program próbuje policzyć pole koła o promieniu podanym przez użytkownika – jeżeli jednak podana przez użytkownika liczba będzie nieprawidłową wartością promienia koła (będzie mniejsza bądź równa 0), program ponownie spróbuje pobrać liczbę – i tak do skutku:

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

public class PoliczPoleKolaContinue {
  public static void main(String[] args) {
    int promien;

    do {
      System.out.print("Podaj promien kola: ");
      promien = getInt();

      if (promien <= 0) {
        System.out.println(
            "Nieprawidlowy promien. Podaj liczbe wieksza od 0"
        );
        continue;
      }

      double poleKola = 3.14 * promien * promien;
      System.out.println("Pole kola o tym promieniu: " + poleKola);
    } while (promien <= 0);
  }

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

W każdej iteracji pętli pobieramy od użytkownika liczbę i sprawdzamy, czy jest ona prawidłowym promieniem koła – jeżeli nie, to wypisujemy stosowny komunikat i korzystamy z instrukcji continue – wykonanie programu przechodzi natychmiast do sprawdzenia warunku działania pętli.

Pętla będzie działać do czasu, aż użytkownik nie poda poprawnego promienia – wtedy warunek pętli przestanie mieć wartość true i pętla się zakończy.

Instrukcje break oraz continue mogą wystąpić w dowolnym miejscu w ciele pętli, ale nie mogą wystąpić poza pętlą.

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.