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

Java SE 5

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 och S är primitiva typer och kan tilldelas utan en roll
  • S är en primitiv typ och T kan konverteras till en typ som kan tilldelas S efter ombokning av unboxing.
  • T är en primitiv typ och kan konverteras till S 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 till switch uttalandet.
  • default : Detta är en valfri, catch-all uttryck, bör ingen av de case uttalanden utvärderas till true .
  • Abrupt slutförandet av case uttalande; vanligtvis break : Detta krävs för att förhindra den oönskade utvärdering av ytterligare case 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
Java SE 5

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

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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow