Java Language
Basis besturingsstructuren
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
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
alsS
zijn primitieve types en toewijsbaar zonder cast -
S
is een primitief type enT
kan worden omgezet in een type dat kan worden toegewezen aanS
na de conversie van het unboxen. -
T
is een primitief type en kan worden omgezet inS
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 deswitch
instructie. -
default
: dit is een optionele, allesomvattende uitdrukking, als geen van decase
statements alstrue
wordt geëvalueerd. - Abrupte beëindiging van de
case
verklaring; meestalbreak
: dit is vereist om de ongewenste evaluatie van verderecase
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
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;
}
}
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;
}
}