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

Java SE 5

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 auch S sind primitive Typen und können ohne Besetzung zugewiesen werden
  • S ist ein primitiver Typ, und T kann nach der Unboxing-Konvertierung in einen Typ konvertiert werden, der S .
  • T ist ein primitiver Typ und kann durch automatische Konvertierung in S 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 der switch Anweisung ausgewertet wird.
  • default : Dies ist ein optionaler Ausdruck für alle case , falls keine der case Anweisungen den Wert true ergibt.
  • Abrupte Beendigung der case - Anweisung; in der Regel break : Dies ist erforderlich, um die unerwünschte Auswertung weiterer case 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
Java SE 5

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;
            
    }
}
Java SE 7

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;
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow