Java Language
Grundläggande kontrollstrukturer
Sök…
Anmärkningar
Alla kontrollstrukturer, om inget annat anges, använder blockuttalanden . Dessa betecknas med lockiga hängslen {}
.
Detta skiljer sig från normala uttalanden , som inte kräver lockiga hängslen, men också har en styv varning, eftersom endast linjen omedelbart efter föregående uttalande skulle beaktas.
Således är det helt giltigt att skriva någon av dessa kontrollstrukturer utan lockiga hängslen, så länge endast ett uttalande följer början, men det är starkt avskräckt , eftersom det kan leda till buggy implementeringar eller trasig kod.
Exempel:
// 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 / Annars 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");
}
if
blocket kommer bara att köras när i
är 1 eller mindre.
else if
villkoret kontrolleras endast om alla villkor före det (i tidigare else if
konstruktioner, och överordnade if
konstruktioner) har testats till false
. I det här exemplet kontrolleras det else if
villkoret endast om i
är större än eller lika med 2.
Om resultatet är true
, körs blocket, och else if
och else
konstrueras efter det kommer att hoppas över.
Om inget av if
och else if
villkoren har testats till true
, kommer det else
blocket i slutet att köras.
För öglor
for (int i = 0; i < 100; i++) {
System.out.println(i);
}
De tre komponenterna för for
loopen (separerad med ;
) är variabel deklaration / initiering (här int i = 0
), villkoret (här i < 100
) och inkrementsatset (här i++
). Variabeldeklarationen görs en gång som om den placeras precis innanför {
på första körningen. Därefter kontrolleras tillståndet, om det är true
kommer slingans kropp att köras, om det är false
kommer slingan att stanna. Förutsatt att slingan fortsätter kommer kroppen att köras och slutligen när }
har nåtts, kommer inkrementet att köras precis innan tillståndet kontrolleras igen.
De lockiga hängslen är valfria (du kan en rad med en semikolon) om slingan bara innehåller en sats. Men det rekommenderas alltid att använda hängslen för att undvika missförstånd och buggar.
Komponenterna for
slinga är valfria. Om din affärslogik innehåller en av dessa delar kan du utelämna motsvarande komponent från din for
loop.
int i = obj.getLastestValue(); // i value is fetched from a method
for (; i < 100; i++) { // here initialization is not done
System.out.println(i);
}
Strukturen for (;;) { function-body }
är lika med en while (true)
slinga.
Nested For Loops
Varje looping-uttalande som har ett annat loop-uttalande inuti kallas kapslad loop. Samma sätt för slingor med mer inre slinga kallas "kapslad för slinga".
for(;;){
//Outer Loop Statements
for(;;){
//Inner Loop Statements
}
//Outer Loop Statements
}
Nested for loop kan visas för att skriva ut triangelformade siffror.
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);
}
}
Medan Loops
int i = 0;
while (i < 100) { // condition gets checked BEFORE the loop body executes
System.out.println(i);
i++;
}
A while
loop körs så länge villkoret inom parentes är true
. Detta kallas också "pre-test loop" -strukturen eftersom det villkorliga uttalandet måste uppfyllas innan huvud loop-kroppen utförs varje gång.
De lockiga hängslen är valfria om slingan bara innehåller ett uttalande, men vissa kodningsstilkonventioner föredrar att ha hängslen oavsett.
gör ... medan Loop
do...while
loop skiljer sig från andra slingor genom att det garanteras att köras minst en gång . Det kallas också "post-test loop" -strukturen eftersom det villkorliga uttalandet utförs efter huvud loop-kroppen.
int i = 0;
do {
i++;
System.out.println(i);
} while (i < 100); // Condition gets checked AFTER the content of the loop executes.
I det här exemplet körs slingan tills numret 100
skrivs ut (även om villkoret är i < 100
och inte i <= 100
), eftersom slingtillståndet utvärderas efter att slingan har körts.
Med garanti för minst en exekvering är det möjligt att deklarera variabler utanför slingan och initiera dem inuti.
String theWord;
Scanner scan = new Scanner(System.in);
do {
theWord = scan.nextLine();
} while (!theWord.equals("Bird"));
System.out.println(theWord);
I detta sammanhang definieras theWord
utanför slingan, men eftersom det garanteras att ha ett värde baserat på dess naturliga flöde, kommer theWord
att initialiseras.
För varje
Med Java 5 och uppåt kan man använda för varje slingor, även känd som förbättrade loopar:
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 varje slingor kan användas för att iterera över Arrays och implementeringar av det Iterable
gränssnittet, det senare inkluderar samlingsklasser , som List
eller Set
.
Loopvariabeln kan vara av valfri typ som kan tilldelas från källtypen.
Loopvariabeln för en förbättrad för loop för Iterable<T>
eller T[]
kan vara av typ S
, om
-
T extends S
- både
T
ochS
är primitiva typer och kan tilldelas utan en roll -
S
är en primitiv typ ochT
kan konverteras till en typ som kan tilldelasS
efter ombokning av unboxing. -
T
är en primitiv typ och kan konverteras tillS
genom autoboxning av konvertering.
Exempel:
T elements = ...
for (S s : elements) {
}
T | S | sammanställer |
---|---|---|
int [] | lång | ja |
lång[] | int | Nej |
Iterable<Byte> | lång | ja |
Iterable<String> | CharSequence | ja |
Iterable<CharSequence> | Sträng | Nej |
int [] | Lång | Nej |
int [] | Heltal | ja |
Om annat
int i = 2;
if (i < 2) {
System.out.println("i is less than 2");
} else {
System.out.println("i is greater than 2");
}
En if
sats sätter koden på villkor beroende på resultatet av villkoret inom parentes. När tillstånd inom parentes är sant kommer det att gå in i blocket för if-uttalande som definieras av lockiga hängslen som {
och }
. öppningsfästet tills stängningsfästet är omfånget för if-uttalandet.
Det else
blocket är valfritt och kan utelämnas. Det körs om if
uttalandet är false
och inte körs om if
uttalandet är sant. I det fallet if
uttalandet körs.
Se även: Ternary If
Byt uttalande
switch
uttalandet är Java: s multi-way branch-uttalande. Det används för att ta platsen för långa if
else if
else
kedjor och göra dem mer läsbara. Till skillnad från if
uttalanden får man dock inte använda ojämlikheter; varje värde måste definieras konkret.
Det finns tre kritiska komponenter i switch
uttalandet:
-
case
: Detta är värdet som utvärderas med avseende på likvärdighet med argumentet tillswitch
uttalandet. -
default
: Detta är en valfri, catch-all uttryck, bör ingen av decase
uttalanden utvärderas tilltrue
. - Abrupt slutförandet av
case
uttalande; vanligtvisbreak
: Detta krävs för att förhindra den oönskade utvärdering av ytterligarecase
uttalanden.
Med undantag av continue
är det möjligt att använda alla uttalanden som skulle orsaka ett plötsligt slutförande av ett uttalande . Detta inkluderar:
-
break
-
return
-
throw
I exemplet nedan skrivs ett typiskt switch
uttalande med fyra möjliga fall, inklusive 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");
}
Genom att utelämna break
eller något uttalande som skulle plötsligt slutföra kan vi utnyttja vad som kallas "fall-through" -fall, som utvärderar mot flera värden. Detta kan användas för att skapa områden för ett värde som ska lyckas mot, men är fortfarande inte lika flexibelt som ojämlikheter.
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");
}
Vid foo == 1
kommer utgången att vara:
I'm equal or greater than one
I'm one, two, or three
Vid foo == 3
kommer utgången att vara:
I'm one, two, or three
Omkopplaren kan också användas med enum
.
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;
}
}
switch
kan också användas med String
.
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 operatör
Ibland måste du kontrollera för ett villkor och ställa in en variabel.
För ex.
String name;
if (A > B) {
name = "Billy";
} else {
name = "Jimmy";
}
Detta kan enkelt skrivas på en rad som
String name = A > B ? "Billy" : "Jimmy";
Värdet på variabeln ställs in på värdet omedelbart efter villkoret, om villkoret är sant. Om villkoret är falskt kommer det andra värdet att ges till variabeln.
Ha sönder
Den break
uttalande avslutar en loop (som for
, while
) eller utvärdering av en switch-sats .
Slinga:
while(true) {
if(someCondition == 5) {
break;
}
}
Loopen i exemplet skulle köra för alltid. Men när someCondition
lika med 5
vid någon utföringspunkt slutar slingan.
Om flera slingor är kaskade slutar endast den mest inre slingan med break
.
Försök ... Fånga ... Äntligen
try { ... } catch ( ... ) { ... }
kontrollstruktur används för att hantera undantag .
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.");
}
Detta skulle skriva ut:
Felaktig input. 'abc' är inte ett giltigt heltal.
En finally
klausul kan läggas till efter catch
. Den finally
klausulen skulle alltid genomföras, oavsett om ett undantag kastades.
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");
}
Detta skulle skriva ut:
Felaktig input. 'abc' är inte ett giltigt heltal.
Denna kod körs alltid, även om ett undantag kastas
Häckt paus / fortsätt
Det är möjligt att break
/ continue
till en yttre slinga genom att använda etikettpåståenden:
outerloop:
for(...) {
innerloop:
for(...) {
if(condition1)
break outerloop;
if(condition2)
continue innerloop; // equivalent to: continue;
}
}
Det finns ingen annan användning för etiketter i Java.
Fortsätt uttalandet i Java
Fortsättningen används för att hoppa över de återstående stegen i den aktuella iterationen och börja med nästa loop-iteration. Kontrollen går från continue
till stegvärdet (inkrement eller minskning), om någon.
String[] programmers = {"Adrian", "Paul", "John", "Harry"};
//john is not printed out
for (String name : programmers) {
if (name.equals("John"))
continue;
System.out.println(name);
}
Den continue
uttalandet kan också göra kontroll av programmet övergång till värdet steg (om någon) av en namngiven loop:
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;
}
}