W języku Java instrukcje breakcontinue stosujemy według schematu:

Linia 1. for otwórz nawias okrągły wyrażenie zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. if otwórz nawias okrągły warunek zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. break średnik. Linia 4. zamknij nawias klamrowy. Linia 5. zamknij nawias klamrowy.

oraz:

Linia 1. for otwórz nawias okrągły wyrażenie zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. if otwórz nawias okrągły warunek zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. continue średnik. Linia 4. zamknij nawias klamrowy. Linia 5. zamknij nawias klamrowy.

Instrukcja break

Instrukcja break przerywa działanie pętli przy określonym warunku if.

Linia 1. int i znak równości 0 średnik. Linia 2. while otwórz nawias okrągły true zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. if otwórz nawias okrągły i znak równości znak równości 9 zamknij nawias okrągły otwórz nawias klamrowy. Linia 4. break średnik. Linia 5. zamknij nawias klamrowy. Linia 7. System kropka out kropka println otwórz nawias okrągły i zamknij nawias okrągły średnik. Linia 8. i plus plus średnik. Linia 9. zamknij nawias klamrowy.

System wydrukuje kolejno liczby od 0 do 8. Przy dziewiątej iteracji następuje przerwanie pętli. Gdybyśmy nie zastosowali instrukcji break w powyższym kodzie, pętla ta byłaby nieskończona i nasz program by się zawiesił. Dzieje się tak, ponieważ warunek tej pętli zawsze jest spełniony.

Działanie instrukcji break można zobrazować w następujący sposób:

R1PxWqmWcM0e9
Źródło: GroMar Sp. z o.o., licencja: CC BY-SA 3.0.

Jeżeli pętla natrafi na przypadek zadeklarowany w warunku if, to zatrzyma działanie pętli (break).

Break jest również wygodnym i czytelnym sposobem na kończenie działania pętli zagnieżdżonych, np.

Linia 1. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny znak równości 4 średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny znak równości 4 średnik j plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. if otwórz nawias okrągły i znak równości znak równości 3 zamknij nawias okrągły otwórz nawias klamrowy. Linia 4. break średnik. Linia 5. zamknij nawias klamrowy. Linia 7. System kropka out kropka print otwórz nawias okrągły cudzysłów asterysk cudzysłów zamknij nawias okrągły średnik. Linia 8. zamknij nawias klamrowy. Linia 10. System kropka out kropka println otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 11. zamknij nawias klamrowy.

Taki program wydrukuje:

Linia 1. asterysk asterysk asterysk asterysk asterysk. Linia 2. asterysk asterysk asterysk asterysk asterysk. Linia 3. asterysk asterysk asterysk asterysk asterysk. Linia 5. asterysk asterysk asterysk asterysk asterysk.

To właśnie dzięki temu fragmentowi kodu:

Linia 1. if otwórz nawias okrągły i znak równości znak równości 3 zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. break średnik. Linia 3. zamknij nawias klamrowy.

czwarta wydrukowana linia jest pusta. Dzieje się tak, ponieważ zatrzymaliśmy wewnętrzną pętle, gdy zewnętrzna jest przy iteracji i == 3.

Instrukcja continue

Instrukcja continue wymusza zakończenie iteracji przy określonym warunku if.

Linia 1. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny 7 średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. if otwórz nawias okrągły i procent 2 znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. continue średnik. Linia 4. zamknij nawias klamrowy. Linia 6. System kropka out kropka println otwórz nawias okrągły i zamknij nawias okrągły średnik. Linia 7. zamknij nawias klamrowy.

Taki program wypisze kolejno liczby 1, 3 i 5 w nowych wierszach. Dlaczego? Ponieważ pętla iteruje po liczbach mniejszych od 7, a gdy liczba jest parzysta, wymusza przejście do następnej iteracji i nie wykonuje instrukcji.

Dla continue schemat blokowy będzie wyglądał następująco:

RDTINUXKDB5IO
Źródło: GroMar Sp. z o.o., licencja: CC BY-SA 3.0.

Jeżeli pętla natrafi na przypadek zadeklarowany w warunku if, to wymusi obrót pętli – nie wykona instrukcji w pętli i przejdzie do kolejnej iteracji.

Różnicę między breakcontinue można przeanalizować na poniższym przykładzie:

Linia 1. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny 100 średnik i plus znak równości 10 zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. if otwórz nawias okrągły i znak równości znak równości 30 zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. break średnik. Linia 4. zamknij nawias klamrowy. Linia 6. System kropka out kropka print otwórz nawias okrągły i plus cudzysłów cudzysłów zamknij nawias okrągły średnik. Linia 7. zamknij nawias klamrowy.

Ten kod wydrukuje w konsoli: 0 10 20.

Linia 1. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny 100 średnik i plus znak równości 10 zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. if otwórz nawias okrągły i znak równości znak równości 30 zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. continue średnik. Linia 4. zamknij nawias klamrowy. Linia 6. System kropka out kropka print otwórz nawias okrągły i plus cudzysłów cudzysłów zamknij nawias okrągły średnik. Linia 7. zamknij nawias klamrowy.

Otrzymamy następujący wynik: 0 10 20 40 50 60 70 80 90.

Ważne!

Instrukcje breakcontinue są również używane do optymalizacji działania programów, szczególnie w długich lub mocno zagnieżdżonych pętlach. Oszczędzają zasoby, bo dzięki temu program nie sprawdza niepotrzebnie wszystkich przypadków.

Pętle nazwane

Obie instrukcje są wykorzystywane w pętlach zagnieżdżonych. Można je też stosować do tworzenia pętli nazwanych (etykietowanych). W tym celu używamy etykietetykietaetykiet, które bardzo się przydają, kiedy np. potrzebujemy zakończyć zewnętrzną pętlę warunkiem w pętli wewnętrznej.

Przykład zagnieżdżonej pętli etykietowanej:

Linia 1. labeledLoop dwukropek. Linia 2. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny 4 średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny 4 średnik j plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 4. if otwórz nawias okrągły i znak równości znak równości 2 zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. break labeledLoop średnik. Linia 6. zamknij nawias klamrowy. Linia 8. System kropka out kropka print otwórz nawias okrągły cudzysłów asterysk cudzysłów zamknij nawias okrągły średnik. Linia 9. zamknij nawias klamrowy. Linia 11. System kropka out kropka println otwórz nawias okrągły cudzysłów cudzysłów zamknij nawias okrągły średnik. Linia 12. zamknij nawias klamrowy.

Wynik takiego programu to tym razem:

Linia 1. asterysk asterysk asterysk asterysk. Linia 2. asterysk asterysk asterysk asterysk.

Dlaczego tak się dzieje? Ponieważ otagowany break zakończy zewnętrzną zaetykietowaną pętlę. Bez etykiety labeledLoop zostałaby zakończona wewnętrzna pętla, w której break się znajduje. Gdybyśmy użyli pętli nieetykietowanej, czyli:

Linia 1. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny 4 średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny 4 średnik j plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. if otwórz nawias okrągły i znak równości znak równości 2 zamknij nawias okrągły otwórz nawias klamrowy. Linia 4. break średnik. Linia 5. zamknij nawias klamrowy. Linia 7. System kropka out kropka print otwórz nawias okrągły cudzysłów asterysk cudzysłów zamknij nawias okrągły średnik. Linia 8. zamknij nawias klamrowy. Linia 10. System kropka out kropka println otwórz nawias okrągły cudzysłów cudzysłów zamknij nawias okrągły średnik. Linia 11. zamknij nawias klamrowy.

przy i równym 2 instrukcja break zakończyłaby działanie jedynie pętli wewnętrznej, a zewnętrzna przeszłaby do kolejnej iteracji. Otrzymamy wtedy taki wynik:

Linia 1. asterysk asterysk asterysk asterysk. Linia 2. asterysk asterysk asterysk asterysk. Linia 4. asterysk asterysk asterysk asterysk.
Ważne!

Mimo że instrukcje breakcontinue są przydatne w pewnych określonych sytuacjach, to zdecydowanie odradza się ich nadużywania. Rozbudowane, wielokrotnie zagnieżdżone pętle z wieloma instrukcjami breakcontinue są trudne do analizy, szczególnie gdy wracamy do swojego kodu po dłuższym czasie lub ktoś musi czytać nasz kod.

Słownik

etykieta
etykieta

to znacznik do oznaczania konkretnej pętli, której działanie chcemy zmodyfikować za pomocą instrukcji break lub continue