Spis treści
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:
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:
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:
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:
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:
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:
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:
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.
Pytanie do zadania - SumujLiczbyWhileBreak,
A gdybym chciał, żeby program zliczył podane przeze mnie liczby gdy podam np.: ''k'' a nie ''0'' jak to trzeba zapisać?
Próbuje to sam jakoś napisać, ale wywala mi błędy.
Mógłbyś to zrobić w następujący sposób: zamiast pobierać od użytkownika liczbę, pobierz tekst. Jeżeli pobrany tekst to "k", to zakończ pętlę i wyświetl sumę dotychczasowych liczb. W przeciwnym razie zamień pobrany tekst na liczbę za pomocą
Integer.parseInt
. Jednakże, jeżeli użytkownik poda coś innego, niż liczbę i niż litera "k", to działanie programu zakończy się błędem, bo próba zamiany wartości podanej przez użytkownika na liczbę wygeneruje wyjątek. Mógłbyś się przed taką sytuacją zabezpieczyć korzystając z łapania wyjątków, które są tematem jednego z kolejnych rozdziałów. Ewentualnie po każdym pobraniu liczby zapytaj użytkownika, czy chce podać kolejną.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.
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 🙂