« poprzedni punkt 

4. Przerywanie i kontynuowanie pętli

Widzieliśmy już w działaniu instrukcję break. Powoduje ona:

  • przerwanie bieżącej (najbardziej wewnętrznej, w której jest umieszczona) pętli 
  • lub - jeśli następuje po niej etykieta - przekazanie sterowania do instrukcji oznaczonej tą etykietą

Dzięki zastosowaniu etykiety możliwe jest wychodzenie z głęboko zagnieżdżonych pętli.
Zobaczmy to na przykładzie:

Poniższy program

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.

Instrukcja continue powoduje przerwanie bieżącej iteracji i przejście do następnej iteracji pętli. Podobnie jak w przypadku break działanie to dotyczy tylko tej (wewnętrznej) pętli, w której instrukcja ta jest umieszczona. Jeśli natomiast użyjemy etykiety, to inicjowana jest następna iteracja tej pętli, która daną etykietą została oznaczona.

Przykładowy program.

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.

Przykładowo, jeśli w tym programie zostanie wprowadzona następująca informacja:

Nagłówek? --- A
Tekst? --- aaa
Tekst? --- bbb
Tekst? ---
Tekst? --- ccc
Tekst? --- nh
Nagłówek? ---
Nagłówek? --- B
Tekst? --- aaa
Tekst? --- bbb

to na konsoli zobaczymy:
1 A : 1 aaa
1 A : 2 bbb
1 A : 4 ccc
3 B : 1 aaa
3 B : 2 bbb
Koniec

Proszę zwrócić uwagę na zmiany numerów iteracji powodowane wprowadzeniem pustego tekstu oraz skutki wprowadzenia tekstu "nh".

Proszę skompilowac program  i prześledzić jego działanie.


« poprzedni punkt