Zoeken…


Opmerkingen

Alle besturingsstructuren maken, tenzij anders vermeld, gebruik van blokafschriften . Deze worden aangegeven met accolades {} .

Dit verschilt van normale uitspraken , waarvoor geen gekrulde accolades nodig zijn, maar die ook een stugge waarschuwing bevatten omdat alleen de regel die direct volgt op de vorige uitspraken in overweging wordt genomen.

Het is dus volkomen geldig om een van deze besturingsstructuren zonder accolades te schrijven, zolang er maar één instructie volgt, maar het wordt sterk afgeraden , omdat dit kan leiden tot buggy-implementaties of gebroken code.

Voorbeeld:

// 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 Control

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

Het if blok wordt alleen uitgevoerd als i 1 of minder is.

De voorwaarde else if wordt alleen aangevinkt als alle voorwaarden ervoor (in vorige else if constructen en de bovenliggende if constructen) op false zijn getest. In dit voorbeeld wordt de voorwaarde else if alleen gecontroleerd als i groter is dan of gelijk is aan 2.

Als het resultaat true , wordt het blok uitgevoerd en worden alle else if en else constructies overgeslagen.

Als geen van de if en else if voorwaarden op true zijn getest, wordt het else blok aan het einde uitgevoerd.

Voor lussen

for (int i = 0; i < 100; i++) {
    System.out.println(i);
}

De drie componenten van de for lus (gescheiden door ; ) zijn variabele declaratie / initialisatie (hier int i = 0 ), de voorwaarde (hier i < 100 ) en de increment-instructie (hier i++ ). De variabele declaratie wordt eenmaal gedaan alsof deze net binnen de { bij de eerste run wordt geplaatst. Zou de conditie wordt gecontroleerd, als het true het lichaam van de lus wordt uitgevoerd, als het false de lus stopt. Ervan uitgaande dat de lus doorgaat, wordt de body uitgevoerd en als de } is bereikt, wordt de increment-instructie uitgevoerd net voordat de voorwaarde opnieuw wordt gecontroleerd.

De accolades zijn optioneel (u kunt één regel met een puntkomma gebruiken) als de lus slechts één instructie bevat. Maar het wordt altijd aanbevolen om accolades te gebruiken om misverstanden en bugs te voorkomen.

De for loop-componenten zijn optioneel. Als uw bedrijfslogica een van deze onderdelen bevat, kunt u het overeenkomstige onderdeel uit uw for lus weglaten.

int i = obj.getLastestValue(); // i value is fetched from a method
    
for (; i < 100; i++) { // here initialization is not done
    System.out.println(i);
}

De structuur for (;;) { function-body } is gelijk aan een while (true) -lus.

Nested For Loops

Elke lusinstructie met een andere lusinstructie die geneste lus wordt genoemd. Dezelfde manier voor lussen met meer binnenste lus wordt 'genest voor lus' genoemd.

    for(;;){
        //Outer Loop Statements
        for(;;){
            //Inner Loop Statements
        }
        //Outer Loop Statements
    }

Genest voor lus kan worden aangetoond dat het driehoekvormige getallen afdrukt.

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

While Loops

int i = 0;
while (i < 100) { // condition gets checked BEFORE the loop body executes
    System.out.println(i);
    i++;
}

Een while lus loopt zolang de voorwaarde tussen haakjes true . Dit wordt ook de "pre-test loop" -structuur genoemd omdat aan de voorwaardelijke instructie moet worden voldaan voordat de hoofdlus telkens wordt uitgevoerd.

De accolades zijn optioneel als de lus slechts één instructie bevat, maar sommige codeerstijlconventies geven er de voorkeur aan om de accolades te gebruiken.

doen ... terwijl Loop

De do...while lus verschilt van andere lussen in die zin dat deze minstens één keer wordt uitgevoerd . Het wordt ook de "post-test loop" -structuur genoemd omdat de voorwaardelijke instructie wordt uitgevoerd na de hoofdlus.

int i = 0;
do {
    i++;
    System.out.println(i);
} while (i < 100); // Condition gets checked AFTER the content of the loop executes.

In dit voorbeeld blijft de lus lopen totdat het nummer 100 wordt afgedrukt (hoewel de voorwaarde i < 100 en niet i <= 100 ), omdat de lusvoorwaarde wordt geëvalueerd nadat de lus is uitgevoerd.

Met de garantie van ten minste één uitvoering, is het mogelijk om variabelen buiten de lus te declareren en binnen te initialiseren.

String theWord;
Scanner scan = new Scanner(System.in);
do {
    theWord = scan.nextLine();
} while (!theWord.equals("Bird"));

System.out.println(theWord);

In deze context wordt het theWord buiten de lus gedefinieerd, maar omdat het gegarandeerd een waarde heeft op basis van zijn natuurlijke stroom, wordt het theWord geïnitialiseerd.

Voor elk

Java SE 5

Met Java 5 en hoger kan men for-elke loops gebruiken, ook bekend als verbeterde for-loops:

List strings = new ArrayList();
        
strings.add("This");
strings.add("is");
strings.add("a for-each loop");
        
for (String string : strings) {
    System.out.println(string);
}

Voor elke loops kunnen worden gebruikt om Arrays en implementaties van de Iterable interface te herhalen, de laatste bevat Collectieklassen , zoals List of Set .


De lusvariabele kan van elk type zijn dat kan worden toegewezen vanuit het brontype.

De lusvariabele voor een verbeterde lus voor Iterable<T> of T[] kan van het type S , als

  • T extends S
  • zowel T als S zijn primitieve types en toewijsbaar zonder cast
  • S is een primitief type en T kan worden omgezet in een type dat kan worden toegewezen aan S na de conversie van het unboxen.
  • T is een primitief type en kan worden omgezet in S door autobox-conversie.

Voorbeelden:

T elements = ...
for (S s : elements) {
}
T S gecompileerd
int [] lang Ja
lang[] int Nee
Iterable<Byte> lang Ja
Iterable<String> CharSequence Ja
Iterable<CharSequence> Draad Nee
int [] Lang Nee
int [] Geheel getal Ja

Indien / anders

int i = 2;
if (i < 2) {
  System.out.println("i is less than 2");
} else {
  System.out.println("i is greater than 2");
}

Een if instructie voert code voorwaardelijk uit, afhankelijk van het resultaat van de voorwaarde tussen haakjes. Wanneer de voorwaarde tussen haakjes waar is, komt deze in het blok van if-instructie die wordt gedefinieerd door accolades zoals { en } . openingshaak tot de eindhaak is het bereik van de if-instructie.

Het else blok is optioneel en kan worden weggelaten. Het loopt als het if verklaring is false en wordt niet uitgevoerd als het if uitspraak waar is Want in dat geval if statement uitvoert.

Zie ook: Ternary If

Schakel statement

De switch instructie is de multi-way branch-instructie van Java. Het wordt gebruikt om lange if - else if - else ketens te vervangen en ze leesbaarder te maken. Anders dan if uitspraken, mag men echter geen ongelijkheden gebruiken; elke waarde moet concreet worden gedefinieerd.

Er zijn drie kritieke componenten voor de switch :

  • case : dit is de waarde die wordt geëvalueerd op gelijkwaardigheid met het argument voor de switch instructie.
  • default : dit is een optionele, allesomvattende uitdrukking, als geen van de case statements als true wordt geëvalueerd.
  • Abrupte beëindiging van de case verklaring; meestal break : dit is vereist om de ongewenste evaluatie van verdere case statements te voorkomen.

Met uitzondering van continue , is het mogelijk om elke instructie te gebruiken die een abrupte voltooiing van een instructie zou veroorzaken. Dit bevat:

  • break
  • return
  • throw

In het onderstaande voorbeeld wordt een typische switch geschreven met vier mogelijke gevallen, inclusief 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");
}

Door het weglaten van een break of een verklaring die een abrupte voltooiing zou zijn, kunnen we gebruikmaken van zogenaamde "fall-through" -gevallen, die evalueren op basis van verschillende waarden. Dit kan worden gebruikt om bereiken te maken waarmee een waarde succesvol kan zijn, maar is nog steeds niet zo flexibel als ongelijkheden.

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

In het geval van foo == 1 de output:

I'm equal or greater than one
I'm one, two, or three

In het geval van foo == 3 de output:

I'm one, two, or three
Java SE 5

De schakeloptie kan ook worden gebruikt met enum s.

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

De switch kan ook worden gebruikt met String s.

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

Ternary Operator

Soms moet u controleren op een voorwaarde en de waarde van een variabele instellen.

Voor ex.

String name;

if (A > B) {
    name = "Billy";
} else {
    name = "Jimmy";
}

Dit kan eenvoudig in één regel worden geschreven als

String name = A > B ? "Billy" : "Jimmy";

De waarde van de variabele wordt onmiddellijk na de voorwaarde ingesteld op de waarde, als de voorwaarde waar is. Als de voorwaarde onwaar is, wordt de tweede waarde aan de variabele gegeven.

Breken

De break beëindigt een lus (zoals for , while ) of de evaluatie van een switch-opdracht .

Lus:

while(true) {
   if(someCondition == 5) {
       break;
   }
}

De lus in het voorbeeld zou voor altijd lopen. Maar wanneer someCondition op een bepaald punt van uitvoering gelijk is aan 5 , eindigt de lus.

Als meerdere lussen in cascade zijn geplaatst, eindigt alleen de binnenste lus met break .

Probeer ... Catch ... Eindelijk

De controlestructuur try { ... } catch ( ... ) { ... } wordt gebruikt voor het afhandelen van uitzonderingen .

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.");
}

Dit zou afdrukken:

Ongeldige invoer. 'abc' is geen geldig geheel getal.

Een finally clausule kan worden toegevoegd na de catch . De finally clausule zou altijd worden uitgevoerd, ongeacht of een uitzondering werd gegooid.

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

Dit zou afdrukken:

Ongeldige invoer. 'abc' is geen geldig geheel getal.
Deze code wordt altijd uitgevoerd, zelfs als een uitzondering wordt gegenereerd

Geneste pauze / doorgaan

Het is mogelijk om een buitenste lus te break / continue te gaan met behulp van labelinstructies:

outerloop:
for(...) {
    innerloop:
    for(...) {
        if(condition1)
            break outerloop;

        if(condition2)
            continue innerloop; // equivalent to: continue;
    }
}

Er is geen ander gebruik voor labels in Java.

Vervolg Verklaring in Java

De instructie continue wordt gebruikt om de resterende stappen in de huidige iteratie over te slaan en te beginnen met de volgende lus iteratie. Het besturingselement gaat van de instructie continue naar de stapwaarde (toename of afname), indien aanwezig.

String[] programmers = {"Adrian", "Paul", "John", "Harry"};

    //john is not printed out
    for (String name : programmers) {
        if (name.equals("John"))
            continue;
        System.out.println(name);
    }

Met continue instructie continue kan de besturing van het programma ook naar de stapwaarde (indien aanwezig) van een benoemde lus worden verplaatst:

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow