4. Przerywanie i kontynuowanie pętli
Widzieliśmy już w działaniu instrukcję break. Powoduje ona:
Dzięki zastosowaniu etykiety możliwe jest wychodzenie z głęboko zagnieżdżonych pętli. public class Break { public static void main(String[] args) { for (int i=1; i < 10; i++) { System.out.println("Petla po i: i = " + i); for (int j=1; j < 10; j++) { if (i + j > 5) break; System.out.println("Pętla po j: i = " + i + " j = " + j); } } } } Petla po i: i = 1
Pętla po j: i = 1 j = 1 Pętla po j: i = 1 j = 2 Pętla po j: i = 1 j = 3 Pętla po j: i = 1 j = 4 Petla po i: i = 2 Pętla po j: i = 2 j = 1 Pętla po j: i = 2 j = 2 Pętla po j: i = 2 j = 3 Petla po i: i = 3 Pętla po j: i = 3 j = 1 Pętla po j: i = 3 j = 2 Petla po i: i = 4 Pętla po j: i = 4 j = 1 Petla po i: i = 5 Petla po i: i = 6 Petla po i: i = 7 Petla po i: i = 8 Petla po i: i = 9 wyprowadzi na konsolę podaną sekwencję napisów. Instrukcja break przerywa tutaj wykonanie pętli w której jest umieszczona ("pętli po j"), nie przerywa natomiast wykonania tej pętli w której wewnętrzna pętla ("po j") jest zagnieżdżona.
Gdybyśmy zastosowali etykietę, to moglibyśmy przerwać działanie pętli zewnętrznej ("po i"): public class Break { public static void main(String[] args) { outerLoop: for (int i=1; i < 10; i++) { System.out.println("Petla po i: i = " + i); for (int j=1; j < 10; j++) { if (i + j > 5) break outerLoop; System.out.println("Pętla po j: i = " + i + " j = " + j); } } } }
i wynik byłby całkiem inny: Petla po i: i = 1
Pętla po j: i = 1 j = 1 Pętla po j: i = 1 j = 2 Pętla po j: i = 1 j = 3 Pętla po j: i = 1 j = 4
Proszę skompilowac oba fragmenty i prześledzić ich działanie, a następnie zmienić zakresy iteracji i znowu prześledzić wyniki. import javax.swing.*; import java.io.*; public class Continue { public static void main(String[] args) { new Continue(); } public Continue() { String header = null; int i = 0; outerLoop: while ((header = ask("Nagłówek?")) != null) { i++; if (header.equals("")) continue; int j = 0; while (true) { String txt = ask("Tekst?"); if (txt == null) break outerLoop; j++; if (txt.equals("")) continue; if (txt.equals("nh")) continue outerLoop; System.out.println(i + " " + header + " : " + j + " " + txt); } } System.out.println("Koniec"); System.exit(0); } private String ask(String txt) { String s = JOptionPane.showInputDialog(txt); return s; } }
Program zawiera dwie pętle. W zewnętrznej użytkownik pytany jest o napis
traktowany jako "nagłówek". Jeżeli poda pusty napis, to pętla przechodzi
do następnej iteracji. W przeciwym razie wprowadzana jest pętla wewnętrzna,
w której użytkownik pytany jest o teksty, a na konsolę wyprowadzany jest
numer iteracji pętli zewnętrznej, nagłówek, numer iteracji pętli wewnętrznej
i tekst podany w pętli wewnętrznej. Jeżeli ten podany tekst jest pusty, to
- zamiast wyprowadzenia napisu - następuje przejście do następnej iteracji
pętli wewnętrznej. Natomiast jeżeli podany tekst to "nh" (next header) -
następuje przejście do następnej iteracji pętli zewnętrznej. Program kończy
działanie gdy w którymkolwiek okienku dialogowym użytkownik wciśnie Cancel.
|