From 33613a85afc4b1481367fbe92a17ee59c240250b Mon Sep 17 00:00:00 2001
From: Sven Eisenhauer
+Java besitzt die drei üblichen Schleifenanweisungen prozeduraler
+Programmiersprachen: eine nichtabweisende, eine abweisende und eine
+Zählschleife. Die Syntax und Semantik der Schleifen ist fast
+vollständig identisch zu den entsprechenden Anweisungen in C.
+
+
+
+
+
+
+Zuerst wird der Testausdruck, der vom Typ boolean
+sein muss, geprüft. Ist er true,
+wird die Anweisung ausgeführt, andernfalls wird mit der ersten
+Anweisung hinter der Schleife weitergemacht. Nachdem die Anweisung
+ausgeführt wurde, wird der Testausdruck erneut geprüft usw.
+Die Schleife wird beendet, sobald der Test false
+ergibt.
+
+
+
+
+
+
+Die do-Schleife
+arbeitet nichtabweisend, d.h. sie wird mindestens einmal ausgeführt.
+Da zunächst die Schleifenanweisung ausgeführt und erst dann
+der Testausdruck überprüft wird, kann die do-Schleife
+frühestens nach einem Durchlauf regulär beendet werden.
+Die Bearbeitung der Schleife wird immer dann beendet, wenn der Test
+des Schleifenausdrucks false
+ergibt.
+
+
+
+
+
+
+Der Kopf der for-Schleife
+besteht aus drei Ausdrücken, die jeder für sich optional
+sind:
+
+In Java gibt es zwei weitere Möglichkeiten, die normale Auswertungsreihenfolge
+in einer Schleife zu verändern. Taucht innerhalb einer Schleife
+eine break-Anweisung
+auf, wird die Schleife verlassen und das Programm mit der ersten Anweisung
+nach der Schleife fortgesetzt. Taucht dagegen eine continue-Anweisung
+auf, springt das Programm an das Ende des Schleifenrumpfs und beginnt
+mit der nächsten Iteration.
+
+
+In der einfachsten Form arbeiten break
+und continue
+genauso wie in C und C++. Beide Anweisungen können innerhalb
+von do-,
+while-
+und for-Schleifen
+verwendet werden. Befindet sich ein break
+innerhalb einer mehrfach geschachtelten Schleife, so verläßt
+es die innerste Schleife. Dies gilt analog
+für continue.
+Neben dieser einfachen Form von break
+und continue
+gibt es in Java noch die mit einem Label versehene Form:
+
+
+Zu jedem mit einem Label versehenen break
+oder continue
+muss es eine mit einem Label versehene Kontrollstruktur geben, die
+diese Anweisung umschließt. Oft wird ein mit einem Label versehenes
+break
+verwendet, um zwei oder mehr ineinander geschachtelte Schleifen zu
+beenden:
+
+
+
+
+
+
+ Titel
+ Inhalt
+ Suchen
+ Index
+ DOC
+ Handbuch der Java-Programmierung, 5. Auflage
+
+ <<
+ <
+ >
+ >>
+ API
+ Kapitel 6 - Anweisungen
+
+
+
+
+
+6.3 Schleifen
+
+
+
+
+
+6.3.1 Die while-Schleife
+
+
+
+
+Syntax
+
+
+
+
+
+
+
+
+
+
+
+
+while (ausdruck)
+ anweisung;
+
+
+Bedeutung
+
+6.3.2 Die do-Schleife
+
+
+
+
+Syntax
+
+
+
+
+
+
+
+
+
+
+
+
+do
+ anweisung;
+while (ausdruck);
+
+
+Bedeutung
+
+6.3.3 Die for-Schleife
+
+
+
+
+Syntax
+
+
+
+
+
+
+
+
+
+
+
+
+for (init; test; update)
+ anweisung;
+
+
+Bedeutung
+
+
+
+
+
+
+
+break und continue
+
+
+
+
+
+
+
+
+
+
+break Label;
+
+continue Label;
+
+
+
+
+
+Listing 6.6: Das gelabelte break
+
+
+
+
+
+001 /* Listing0606.java */
+002
+003 import java.io.*;
+004
+005 public class Listing0606
+006 {
+007 public static void main(String[] args)
+008 {
+009 int[][] data = new int[10][10];
+010
+011 //Multiplikationstafel erstellen
+012 for (int i = 1; i <= 10; ++i) {
+013 for (int j = 1; j <= 10; ++j) {
+014 data[i - 1][j - 1] = i * j;
+015 }
+016 }
+017
+018 //Produkt größer 43 suchen
+019 loop1:
+020 for (int i = 1; i <= 10; ++i) {
+021 for (int j = 1; j <= 10; ++j) {
+022 if (data[i - 1][j - 1] > 43) {
+023 System.out.println(i + "*" + j + "=" + (i*j));
+024 break loop1;
+025 }
+026 }
+027 }
+028 }
+029 }
+
+
+Listing0606.java
+
+Das Programm erstellt zunächst eine Multiplikationstafel für +die Zahlen von 1 bis 10. Ab Zeile 018 +sucht es dann in einer geschachtelten Schleife nach den ersten beiden +Faktoren, deren Produkt 43 übersteigt. Die äußere +der beiden Schleifen hat das Label loop1, +die innere ist ohne Label. Wenn die Anweisung break +loop1; ausgeführt wird, springt das Programm an das +Ende des mit dem Label loop1 +markierten Anweisungsblocks, also hinter die geschweifte Klammer in +Zeile 027. Hätten wir +ein ungelabeltes break verwendet, +wäre das Programm lediglich bis an das Ende von Zeile 026 +gesprungen, und die äußere Schleife hätte eine weitere +Iteration durchgeführt. + +
+Vollkommen analog zu der mit einem Label versehenen break-Anweisung +kann auch die mit einem Label versehene Form der continue-Anweisung +verwendet werden, um die nächste Iteration einer weiter außen +liegenden Schleife einzuleiten. +
+
![]() |
+
+
+ +Die break- +und continue-Anweisungen, +insbesondere die mit einem Label versehenen, stellen Sprunganweisungen +dar. Im Vergleich zu den goto-Anweisungen +anderer Programmiersprachen sind ihre Fähigkeiten aber auf kontrollierte +Sprünge in Schleifenanweisungen beschränkt. Eine allgemeine +Sprunganweisung gibt es in Java nicht (die Sprachdesigner haben sich +aber scheinbar ein Hintertürchen offengelassen und goto +zu einem reservierten Wort erklärt). |
+
+
|
+![]() |
+
+Die Bedeutung von gelabelten break- +und continue-Anweisungen +ist in der Praxis nicht so groß, wie man vermuten könnte. +Unbedacht eingesetzt, können sie die Lesbarkeit eines Programms +sogar vermindern. Eine weitere nützliche Anwendung des gelabelten +break +besteht darin, eine Schleife aus einer darin liegenden switch-Anweisung +zu verlassen. + + + + +
+
![]() |
+![]() |
+
+
+ +Mit Java 5 wurde die for-Schleife +um eine syntaktische Variante erweitert, die den Umgang mit listenartigen +Datenstrukturen, wie Collections und Arrays, vereinfacht. Diese, auch +als »foreach« +bezeichnete Variante wird erst nach der Behandlung von Objekten (Kapitel 7 +bis Kapitel 10) und der Einführung +von Collections (Kapitel 14 +und Kapitel 15) voll +verständlich. Aus Gründen der Systematik soll sie trotzdem +an dieser Stelle erläutert werden; der Abschnitt kann aber beim +ersten Lesen übersprungen werden. |
+
+
|
+![]() |
+
+Die erweiterte for-Schleife +hat folgende Syntax: +
+
+
++for (formalerparameter : ausdruck) + anweisung; ++ + |
+
+»formalerparameter« ist dabei eine aus Datentyp und Variablenname
+bestehende Parameterdeklaration der Art Integer
+i oder Object o,
+und »ausdruck« ist eine Instanz oder ein Ausdruck des Typs
+java.lang.Iterable
+oder ein Array. Angewendet auf eine Collection hat die erweiterte
+for-Schleife
+dieselbe Bedeutung wie folgendes Codestück:
+
+
+for (Iterator it = ausdruck.iterator(); it.hasNext(); ) {
+ formalerparameter = it.next();
+ anweisung
+}
+
+
+
+
+Ein einfaches Beispiel zeigt die Anwendung in der Praxis: + + +
+
+
+
+001 public static void printVector1(Vector v)
+002 {
+003 for (Iterator it = v.iterator(); it.hasNext(); ) {
+004 Object o = it.next();
+005 System.out.println(o);
+006 }
+007 }
+008
+009 public static void printVector2(Vector v)
+010 {
+011 for (Object o : v) {
+012 System.out.println(o);
+013 }
+014 }
+
+ |
+
+In printVector1 wird eine konventionelle +for-Schleife +verwendet, um die Elemente des Vectors auf der Konsole auszugeben. +Dazu wird zunächst ein Iterator +deklariert, am Anfang der Schleife initialisiert und bei jedem Schleifendurchlauf +darauf zugegriffen. Das ist etwas umständlich und syntaktisch +nicht sehr elegant. Die Methode printVector2 +verwendet dagegen die erweiterte for-Schleife +und kann völlig auf die explizite Deklaration und Verwendung +des Iterators verzichten. Sie hat die gleiche Bedeutung wie die erste +Variante. Der Code ist nun einfacher zu lesen und intuitiv zu verstehen +(der Doppelpunkt in der Schleifendeklaration wird wie »in« +gelesen). + +
+Die erweiterte for-Schleife
+läßt sich auch auf Arrays anwenden. Sie ist dann eine Kurzform
+für folgendes Codestück:
+
+
+Typ[] a = ausdruck;
+for (int i = 0; i < a.length; i++) {
+ formalerparameter = a[i];
+ statement
+}
+
+
+
+
+Daß dies ähnlich nützlich ist wie die Anwendung auf +Collections, zeigt folgendes Beispiel: + + +
+
+
+
+001 public static void printArray1(int[] args)
+002 {
+003 // Ausgabe aller Elemente des Arrays über den Index
+004 for (int i = 0; i < args.length; ++i) {
+005 System.out.println(args[i]);
+006 }
+007 }
+008
+009 public static void printArray2(int[] args)
+010 {
+011 // Ausgabe aller Elemente des Arrays über die erweiterte
+012 // for-Schleife (gelesen: für all a im Array args)
+013 for (int a : args) {
+014 System.out.println(a);
+015 }
+016 }
+
+ |
+
+So wird der Code einfacher und klarer. +
+
![]() |
+
+
+ +Die erweiterte for-Schleife +wurde nicht entwickelt, um alle Spezialfälle eines Collection- +oder Array-Durchlaufs abzubilden. Sie will lediglich den vermutlich +häufigsten Fall vereinfachen, nämlich das einmalige Durchlaufen +aller Elemente von vorne nach hinten. Für Sonderfälle ist +nach wie vor die konventionelle for-Schleife +zuständig. Zu diesen zählen beispielsweise: +
|
+
+
|
+![]() |
+
| Titel + | Inhalt + | Suchen + | Index + | DOC + | Handbuch der Java-Programmierung, 5. Auflage, Addison +Wesley, Version 5.0.1 + |
| << + | < + | > + | >> + | API + | © 1998, 2007 Guido Krüger & Thomas +Stark, http://www.javabuch.de + |