Java Language
Grundlegende Kontrollstrukturen
Suche…
Bemerkungen
Alle Kontrollstrukturen verwenden, sofern nicht anders angegeben, Blockanweisungen . Diese sind durch geschweifte Klammern {}
.
Dies unterscheidet sich von normalen Aussagen , die geschweiften Klammern nicht erforderlich ist , sondern auch mit einem steifen Vorbehalt kommen , dass nur die Zeile unmittelbar nach der vorangegangenen Aussage betrachtet werden würde.
Daher ist es absolut zulässig, eine dieser Kontrollstrukturen ohne geschweifte Klammern zu schreiben, solange nur eine Anweisung dem Anfang folgt. Es wird jedoch dringend davon abgeraten , da dies zu fehlerhaften Implementierungen oder fehlerhaftem Code führen kann.
Beispiel:
// valid, but discouraged
Scanner scan = new Scanner(System.in);
int val = scan.nextInt();
if(val % 2 == 0)
System.out.println("Val was even!");
// invalid; will not compile
// note the misleading indentation here
for(int i = 0; i < 10; i++)
System.out.println(i);
System.out.println("i is currently: " + i);
If / Else If / Else Kontrolle
if (i < 2) {
System.out.println("i is less than 2");
} else if (i > 2) {
System.out.println("i is more than 2");
} else {
System.out.println("i is not less than 2, and not more than 2");
}
Der if
Block wird nur ausgeführt, wenn i
1 oder weniger ist.
Die else if
Bedingung wird nur geprüft, wenn alle Bedingungen davor (in den vorherigen else if
Konstrukten und die übergeordneten if
Konstrukte) auf false
getestet wurden. In diesem Beispiel wird die Bedingung else if
nur geprüft, wenn i
größer oder gleich 2 ist.
Wenn das Ergebnis true
, wird der Block ausgeführt, und alle else if
und else
Konstrukte, die danach erstellt werden, werden übersprungen.
Wenn keiner der if
und else if
, true
else
else if
Bedingungen zu getestet true
, die else
wird Block am Ende ausgeführt werden.
Für Loops
for (int i = 0; i < 100; i++) {
System.out.println(i);
}
Die drei Komponenten der for
Schleife (getrennt durch ;
) sind Variablendeklaration / Initialisierung (hier int i = 0
), die Bedingung (hier i < 100
) und die Inkrement-Anweisung (hier i++
). Die Variablendeklaration wird einmal ausgeführt, als würde sie beim ersten Durchlauf direkt innerhalb von {
platziert. Dann wird die Bedingung überprüft, wenn sie true
ist true
der Hauptteil der Schleife ausgeführt. Wenn sie false
ist, stoppt die Schleife. Unter der Annahme, dass die Schleife fortgesetzt wird, wird der Körper ausgeführt, und wenn }
erreicht wird, wird die Inkrementierungsanweisung ausgeführt, bevor die Bedingung erneut geprüft wird.
Die geschweiften Klammern sind optional (Sie können eine Zeile mit einem Semikolon verwenden), wenn die Schleife nur eine Anweisung enthält. Es wird jedoch immer empfohlen, Zahnspangen zu verwenden, um Missverständnisse und Fehler zu vermeiden.
Die for
Loop-Komponenten sind optional. Wenn Ihre Geschäftslogik einen dieser Teile enthält, können Sie die entsprechende Komponente in Ihrer for
Schleife auslassen.
int i = obj.getLastestValue(); // i value is fetched from a method
for (; i < 100; i++) { // here initialization is not done
System.out.println(i);
}
Die for (;;) { function-body }
-Struktur entspricht einer while (true)
-Schleife.
Nested For Loops
Jede Schleifenanweisung mit einer anderen Schleifenanweisung innerhalb einer geschachtelten Schleife. Der gleiche Weg für das Looping mit mehr innerer Schleife wird als "verschachtelte for-Schleife" bezeichnet.
for(;;){
//Outer Loop Statements
for(;;){
//Inner Loop Statements
}
//Outer Loop Statements
}
Verschachtelte for-Schleife kann demonstriert werden, um dreieckige Zahlen zu drucken.
for(int i=9;i>0;i--){//Outer Loop
System.out.println();
for(int k=i;k>0;k--){//Inner Loop -1
System.out.print(" ");
}
for(int j=i;j<=9;j++){//Inner Loop -2
System.out.print(" "+j);
}
}
Während Schleifen
int i = 0;
while (i < 100) { // condition gets checked BEFORE the loop body executes
System.out.println(i);
i++;
}
A while
Schleife läuft solange die Bedingung innerhalb der Klammern ist true
. Dies wird auch als "Pre-Test-Loop" -Struktur bezeichnet, da die Bedingungsanweisung erfüllt werden muss, bevor der Hauptschleifenkörper jedes Mal ausgeführt wird.
Die geschweiften Klammern sind optional, wenn die Schleife nur eine Anweisung enthält. Einige Codierungsstilkonventionen bevorzugen jedoch die geschweiften Klammern.
mache ... während der Schleife
Die do...while
Schleife unterscheidet sich von anderen Schleifen dadurch, dass sie mindestens einmal ausgeführt wird . Sie wird auch als "Post-Test-Loop" -Struktur bezeichnet, da die Bedingungsanweisung nach dem Hauptschleifenrumpf ausgeführt wird.
int i = 0;
do {
i++;
System.out.println(i);
} while (i < 100); // Condition gets checked AFTER the content of the loop executes.
In diesem Beispiel wird die Schleife ausgeführt, bis die Zahl 100
gedruckt ist (obwohl die Bedingung i < 100
und nicht i <= 100
), da die Schleifenbedingung nach Ausführung der Schleife ausgewertet wird.
Mit der Garantie von mindestens einer Ausführung ist es möglich, Variablen außerhalb der Schleife zu deklarieren und sie innerhalb zu initialisieren.
String theWord;
Scanner scan = new Scanner(System.in);
do {
theWord = scan.nextLine();
} while (!theWord.equals("Bird"));
System.out.println(theWord);
In diesem Zusammenhang wird theWord
außerhalb der Schleife definiert. Da es jedoch garantiert ist, dass es einen Wert auf der Grundlage seines natürlichen Flusses hat, wird das theWord
initialisiert.
Für jeden
Mit Java 5 und höher können For-Each-Loops, auch als erweiterte For-Loops bezeichnet, verwendet werden:
List strings = new ArrayList();
strings.add("This");
strings.add("is");
strings.add("a for-each loop");
for (String string : strings) {
System.out.println(string);
}
Für jede Schleife können Arrays und Implementierungen der Iterable
Schnittstelle Iterable
werden, die spätere enthält Collections- Klassen wie List
oder Set
.
Die Schleifenvariable kann von einem beliebigen Typ sein, der vom Quelltyp zuweisbar ist.
Die Schleifenvariable für eine erweiterte for-Schleife für Iterable<T>
oder T[]
kann vom Typ S
, wenn
-
T extends S
- Sowohl
T
als auchS
sind primitive Typen und können ohne Besetzung zugewiesen werden -
S
ist ein primitiver Typ, undT
kann nach der Unboxing-Konvertierung in einen Typ konvertiert werden, derS
. -
T
ist ein primitiver Typ und kann durch automatische Konvertierung inS
umgewandelt werden.
Beispiele:
T elements = ...
for (S s : elements) {
}
T | S | Kompiliert |
---|---|---|
int [] | lange | Ja |
lange[] | int | Nein |
Iterable<Byte> | lange | Ja |
Iterable<String> | Zeichenfolge | Ja |
Iterable<CharSequence> | String | Nein |
int [] | Lange | Nein |
int [] | Ganze Zahl | Ja |
Ansonsten
int i = 2;
if (i < 2) {
System.out.println("i is less than 2");
} else {
System.out.println("i is greater than 2");
}
Eine if
Anweisung führt den Code abhängig vom Ergebnis der Bedingung in Klammern aus. Wenn die Bedingung in Klammern wahr ist, wird der Block der if -Anweisung eingegeben, der durch geschweifte Klammern wie {
und }
. Das Öffnen der Klammer bis zur schließenden Klammer ist der Geltungsbereich der if-Anweisung.
Der else
Block ist optional und kann weggelassen werden. Sie wird ausgeführt, wenn die if
Anweisung false
und nicht, wenn die if
Anweisung true ist. In diesem Fall wird die if
Anweisung ausgeführt.
Siehe auch: Ternary If
Anweisung wechseln
Die switch
Anweisung ist die Mehrfachzweig-Anweisung von Java. Es wird verwendet, um lange if
- else if
- else
Ketten zu ersetzen und sie lesbarer zu machen. Im Gegensatz zu if
Anweisungen darf man jedoch keine Ungleichungen verwenden. Jeder Wert muss konkret definiert werden.
Die switch
Anweisung besteht aus drei wichtigen Komponenten:
-
case
: Dies ist der Wert, der auf Äquivalenz mit dem Argument derswitch
Anweisung ausgewertet wird. -
default
: Dies ist ein optionaler Ausdruck für allecase
, falls keine dercase
Anweisungen den Werttrue
ergibt. - Abrupte Beendigung der
case
- Anweisung; in der Regelbreak
: Dies ist erforderlich, um die unerwünschte Auswertung weiterercase
Anweisungen zu verhindern.
Mit Ausnahme von continue
kann eine beliebige Anweisung verwendet werden, die den abrupten Abschluss einer Anweisung verursachen würde . Das beinhaltet:
-
break
-
return
-
throw
In dem folgenden Beispiel wird eine typische switch
Anweisung mit vier möglichen Fällen einschließlich default
.
Scanner scan = new Scanner(System.in);
int i = scan.nextInt();
switch (i) {
case 0:
System.out.println("i is zero");
break;
case 1:
System.out.println("i is one");
break;
case 2:
System.out.println("i is two");
break;
default:
System.out.println("i is less than zero or greater than two");
}
Durch das Weglassen von break
oder einer Anweisung, die zu einem abrupten Abschluss führen würde, können wir sogenannte "Fall-Through" -Fälle nutzen, die verschiedene Werte auswerten. Dies kann zum Erstellen von Bereichen verwendet werden, für die ein Wert erfolgreich ist, ist aber noch nicht so flexibel wie Ungleichungen.
Scanner scan = new Scanner(System.in);
int foo = scan.nextInt();
switch(foo) {
case 1:
System.out.println("I'm equal or greater than one");
case 2:
case 3:
System.out.println("I'm one, two, or three");
break;
default:
System.out.println("I'm not either one, two, or three");
}
Im Falle von foo == 1
die Ausgabe:
I'm equal or greater than one
I'm one, two, or three
Im Falle von foo == 3
die Ausgabe:
I'm one, two, or three
Die switch-Anweisung kann auch mit enum
s verwendet werden.
enum Option {
BLUE_PILL,
RED_PILL
}
public void takeOne(Option option) {
switch(option) {
case BLUE_PILL:
System.out.println("Story ends, wake up, believe whatever you want.");
break;
case RED_PILL:
System.out.println("I show you how deep the rabbit hole goes.");
break;
}
}
Die switch
Anweisung kann auch mit String
s verwendet werden.
public void rhymingGame(String phrase) {
switch (phrase) {
case "apples and pears":
System.out.println("Stairs");
break;
case "lorry":
System.out.println("truck");
break;
default:
System.out.println("Don't know any more");
}
}
Ternärer Betreiber
Manchmal müssen Sie nach einer Bedingung suchen und den Wert einer Variablen festlegen.
Für ex.
String name;
if (A > B) {
name = "Billy";
} else {
name = "Jimmy";
}
Dies kann leicht in eine Zeile geschrieben werden als
String name = A > B ? "Billy" : "Jimmy";
Der Wert der Variablen wird unmittelbar nach der Bedingung auf den Wert gesetzt, wenn die Bedingung erfüllt ist. Wenn die Bedingung falsch ist, wird der Variable der zweite Wert zugewiesen.
Brechen
Die break
Anweisung beendet eine Schleife (wie for
, while
) oder die Auswertung einer switch-Anweisung .
Schleife:
while(true) {
if(someCondition == 5) {
break;
}
}
Die Schleife im Beispiel würde für immer laufen. Wenn jedoch someCondition
an einem Punkt der Ausführung gleich 5
, endet die Schleife.
Wenn mehrere Schleifen kaskadiert sind, endet nur die innerste Schleife mit break
.
Versuchen Sie ... Fang ... Endlich
Die Kontrollstruktur try { ... } catch ( ... ) { ... }
wird für die Behandlung von Ausnahmen verwendet .
String age_input = "abc";
try {
int age = Integer.parseInt(age_input);
if (age >= 18) {
System.out.println("You can vote!");
} else {
System.out.println("Sorry, you can't vote yet.");
}
} catch (NumberFormatException ex) {
System.err.println("Invalid input. '" + age_input + "' is not a valid integer.");
}
Dies würde drucken:
Ungültige Eingabe. 'abc' ist keine gültige ganze Zahl.
Eine finally
Klausel kann nach dem hinzugefügt werden , catch
. Die finally
Klausel wird immer ausgeführt, unabhängig davon, ob eine Ausnahme ausgelöst wurde.
try { ... } catch ( ... ) { ... } finally { ... }
String age_input = "abc";
try {
int age = Integer.parseInt(age_input);
if (age >= 18) {
System.out.println("You can vote!");
} else {
System.out.println("Sorry, you can't vote yet.");
}
} catch (NumberFormatException ex) {
System.err.println("Invalid input. '" + age_input + "' is not a valid integer.");
} finally {
System.out.println("This code will always be run, even if an exception is thrown");
}
Dies würde drucken:
Ungültige Eingabe. 'abc' ist keine gültige ganze Zahl.
Dieser Code wird immer ausgeführt, auch wenn eine Ausnahme ausgelöst wird
Verschachtelte Pause / weiter
Es ist möglich, eine äußere Schleife mit den Label-Anweisungen zu break
/ continue
:
outerloop:
for(...) {
innerloop:
for(...) {
if(condition1)
break outerloop;
if(condition2)
continue innerloop; // equivalent to: continue;
}
}
Es gibt keine andere Verwendung für Etiketten in Java.
Continue-Anweisung in Java
Die continue-Anweisung wird verwendet, um die verbleibenden Schritte in der aktuellen Iteration zu überspringen und mit der nächsten Schleifeniteration zu beginnen. Die Steuerung wechselt von der continue
Anweisung zum Schrittwert (Inkrement oder Dekrement), falls vorhanden.
String[] programmers = {"Adrian", "Paul", "John", "Harry"};
//john is not printed out
for (String name : programmers) {
if (name.equals("John"))
continue;
System.out.println(name);
}
Die continue
Anweisung kann auch die Steuerung des Programms zum Schrittwert (falls vorhanden) einer benannten Schleife verschieben:
Outer: // The name of the outermost loop is kept here as 'Outer'
for(int i = 0; i < 5; )
{
for(int j = 0; j < 5; j++)
{
continue Outer;
}
}