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ą.

Komentarze (2):

  1. A czy w programie PoliczPoleKolaContinue.java nie powinno być warunku dla while (promien > 0); zamiast while (promien <= 0); ? Przecież wartością true dla wykonywanej pętli do while tu będzię promień inny niż promień sprawdzany przez zagnieżdżony if.

    1. Warunek tak zapisany ma spowodować, że pętla się nie zakończy jeżeli użytkownik poda niepoprawny promień. Jeżeli promień będzie poprawny, tzn. > 0, to ani warunek instrukcji if, ani pętli while, nie będzie spełniony, więc pole koła zostanie wyliczone, wypisane, a następnie pętla zakończy swoje działanie. Rozumiem, że ten przykład może nie być jasny na pierwszy rzut oka, zastanowię się nad jego aktualizacją. Dziękuję za komentarz 🙂

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.