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
TochSär primitiva typer och kan tilldelas utan en roll -
Sär en primitiv typ ochTkan konverteras till en typ som kan tilldelasSefter ombokning av unboxing. -
Tär en primitiv typ och kan konverteras tillSgenom 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 tillswitchuttalandet. -
default: Detta är en valfri, catch-all uttryck, bör ingen av decaseuttalanden utvärderas tilltrue. - Abrupt slutförandet av
caseuttalande; vanligtvisbreak: Detta krävs för att förhindra den oönskade utvärdering av ytterligarecaseuttalanden.
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;
}
}