Saturday, April 1, 2006

Java tutorial - Draaiboek

Intro|Basics|Elementen|Bouwstenen|Datatypen|Operatoren|Toegangscontrole|Draaiboek|Foutenafhandeling|Objecten|Uitvoeren

Keuzes maken binnen de Java code

Gecontroleerde doorstroming (flow control)

Er zijn drie vormen van gecontroleerde doorstroming: selectie-statementen, herhaal-statementen en overdracht-statementen. Hiermee kun je het verloop van de Java code beïnvloeden door keuzes te maken, herhalingen te introduceren en antwoorden te doorgeven.

Terug naar boven

Selectie statementen (selection statements)

De selectie statementen if, if-else en switch maken het mogelijk om keuzes te kunnen maken in de Java code. Bij de if en de if-else is de keuze gebaseerd op het booleanse antwoord van de gegeven voorwaarde, ofwel de voorwaarde moet als antwoord true of false kunnen geven. De switch statement accepteert alleen nummerieke datatypen of enums als invoer (dus geen booleanse antwoorden of gewone objecten).

De if statement:

if (voorwaarde) {
    statementblok
}

Alleen wanneer de voorwaarde een true oplevert, dan wordt de statementblok uitgevoerd.

public class Auto {

    public void schakelen1(int aantalZetten) {
        versnelling = versnelling + aantalZetten;
        
        // De eenvoudige if statement. Wanneer de huidige versnelling te hoog
        // is, dan wordt de versnelling bijgesteld naar de maximum versnelling
        // en wordt er een melding naar de systeemconsole gestuurd.
        if (versnelling > maximumVersnelling) {
            versnelling = maximumVersnelling;
            System.out.println("Er is geen hogere versnelling beschikbaar.");
        }
    }

}

De if-else statement:

if (voorwaarde) {
    statementblok
} else {
    statementblok
}

Wanneer de voorwaarde een true oplevert, dan wordt de statementblok van de if blok uitgevoerd, anders die van de else blok.

public class Auto {

    public void schakelen2(int aantalZetten) {
        
        // Dit is een iets aangepaste versie van de hierboven beschreven
        // eenvoudige if statement.
        if (versnelling + aantalZetten > maximumVersnelling) {
            versnelling = maximumVersnelling;
            System.out.println("Er is geen hogere versnelling beschikbaar.");
        } else {
            versnelling = versnelling + aantalZetten;
        }
    }

    public void schakelen3(int aantalZetten) {
        
        // Je kan de if en if-else statments ook "nesten".
        if (versnelling + aantalZetten > maximumVersnelling) {
            versnelling = maximumVersnelling;
            System.out.println("Er is geen hogere versnelling beschikbaar.");
        } else {
            if (versnelling + aantalZetten < 0) {
                versnelling = 0;
                System.out.println("Er is geen lagere versnelling beschikbaar.");
            } else {
                versnelling = versnelling + aantalZetten;
            }
        }
    }

    public void schakelen4(int aantalZetten) {
        
        // Of, iets netter, met gelijkmatige nesting zonder inspringingen.
        if (versnelling + aantalZetten > maximumVersnelling) {
            versnelling = maximumVersnelling;
            System.out.println("Er is geen hogere versnelling beschikbaar.");
        } else if (versnelling + aantalZetten < 0) {
            versnelling = 0;
            System.out.println("Er is geen lagere versnelling beschikbaar.");
        } else {
            versnelling = versnelling + aantalZetten;
        }
    }

}

De switch statement:

switch (voorwaarde) {
    case match1:
        statementblok1
        break;
    case match2:
        statementblok2
        break;
    ...
    default:
        statementblok
        break;
}

Indien in een van de case statementen een match met de waarde van de voorwaarde is gevonden, dan wordt de statementblok van deze case uitgevoerd. Indien er niks is gevonden en de default statement is gedefinieerd, dan wordt de statementblok van de default uitgevoerd. De default statement is overigens niet verplicht. De break statement is niet verplicht, maar zonder de break statement wordt de rest van de hele switch blok uitgevoerd, ook al zit de match niet in de andere case statementen (fall-through). Met de break statement spring je uit de switch blok waarin je op het moment zit.

public class Auto {

    public void getHuidigeVersnelling() {
        
        // De switch statement. Er wordt gekeken met welke waarde de
        // variabele "versnelling" overeenkomt.
        switch (versnelling) {
            case 1:
                System.out.println("Dit is de eerste versnelling.");
                break;
            case 2:
                System.out.println("Dit is de tweede versnelling.");
                break;
            case 3:
                System.out.println("Dit is de derde versnelling.");
                break;
            case 4:
                System.out.println("Dit is de vierde versnelling.");
                break;
            case 5:
                System.out.println("Dit is de vijfde versnelling.");
                break;
            default:
                System.out.println("Deze versnelling is onbekend.");
                break;
        }
    }

}
Terug naar boven

Herhaal statementen (iteration statements)

De herhaal statementen while, for en do-while vormen statement blokken (loop body) waarin dezelfde stukje code voortdurend wordt herhaald (loops) totdat de booleanse antwoord van de gegeven voorwaarde (loop condition) een false oplevert. De while en for herhaal statementen beoordelen eerst de gegeven voorwaarde, voordat aan de statement blok wordt begonnen, terwijl de do-while dat pas ná het uitvoeren van de statement blok doet.

De while statement:

while (voorwaarde) {
    statementblok
}

Zolang de voorwaarde nog een true oplevert, dan wordt de statementblok uitgevoerd. In regel wordt binnen de statementblok of zelfs binnen de voorwaarde geregeld wanneer de voorwaarde een false moet opleveren. Een voorbeeldje:

public class Klasse {

    public void methode() {
        int i = 0;

        // De while statement.
        while (i++ < 5) {
            System.out.println(i);
        }
    }

}

Met als uitkomst:

1
2
3
4
5

De standaard for statement:

for (initialisatie; voorwaarde; expressie) {
    statementblok
}

Binnen initialisatie moet je de loop-variabele voor de for statement initialiseren. Deze loop-variabele kun je dan aan een voorwaarde koppelen binnen voorwaarde. In expressie wordt aangegeven of de loop-variabele telkens met 1 stap omhoog of omlaag moet, dit wordt gedaan met behulp van vermeerdering en vermindering operatoren. Zolang de voorwaarde nog een true oplevert, dan wordt de statementblok uitgevoerd. Een voorbeeldje:

public class Klasse {

    public void methode() {
        
        // De standaard for statement.
        for (int i = 0; i < 5; i++) {
            System.out.println(i);
        }
    }

}

Met als uitkomst:

0
1
2
3
4

De for statement voor array's:

for (declaratie : expressie) {
    statementblok
}

Binnen declaratie moet je een (referentie-)variabele declareren dat overeenkomt met elk der waarden of objecten van de ordinaire array dat in de expressie wordt opgegeven. De array wordt doorgelopen en elk element van de array wordt in de (referentie-)variabele van de declaratie gestopt, waarna de statementblok per element wordt uitgevoerd. Een voorbeeldje:

public class Klasse {

    public void methode() {
        
        // Declareer en initialiseer een ordinaire int array.
        int[] array1 = {0, 1, 2, 3, 4};

        // De for statement voor array's.
        for (int i : array1) {
            System.out.println(i);
        }
        
        // Dit kun je dus ook toepassen op objecten.
        // Declareer en initialiseer een ordinaire String array.
        String[] array2 = {"nul", "een", "twee", "drie", "vier"};

        // De for statement voor array's.
        for (String s : array2) {
            System.out.println(s);
        }
    }

}

Met als uitkomst:

0
1
2
3
4
nul
een
twee
drie
vier

De do-while statement:

do {
    statementblok
} while (voorwaarde);

De statementblok wordt zolang uitgevoerd totdat de voorwaarde een false oplevert. In regel wordt binnen de statementblok geregeld wanneer de voorwaarde een false moet opleveren. Een voorbeeldje:

public class Klasse {

    public void methode() {
        int i = 0;

        // De do-while statement.
        do {
            System.out.println(i);
        } while (i++ < 5);
    }

}

Met als uitkomst:

0
1
2
3
4
5

De infinite loop:

Let wel goed op dat je de herhaal statementen zorgvuldig construeert dat het niet in een oneindige lus terecht komt (infinite loop). Bijvoorbeeld:

public class Klasse {

    public void methode() {
        int i = 0;

        // De while statement met een infinite loop.
        while (i == 0) {
            System.out.println(i);
        }
    }

}

Dit zou een oneindige rij nullen geven in de uitkomst.

Terug naar boven

Overdracht statementen (transfer statements)

Met de overdracht statementen break, continue en return hou je controle over de verloop van de Java code binnen de selectie statementen, herhaal statementen en methoden. De try-catch-finally en de throw statementen zijn in principe ook overdracht statementen, echter deze worden in het volgende hoofdstuk behandeld: Foutenafhandeling.

De break statment:

Met de break statment kun je uit de switch selectie statement en uit alle herhaal statementen springen zonder dat de rest van de statement wordt uitgevoerd. De break van een switch selectie statement is hierboven al uitgelegd bij Selectie statementen. Binnen de herhaal statementen while, for en do-while gedraagt de break statement zich hetzelfde, hier wordt dan ook enkel een voorbeeld met de while statement gegeven:

public class Klasse {

    public void methode() {
        int i = 0;

        // De while statement met een break statement.
        while (i++ < 5) {
            if (i == 3) {
                break;
            }
            System.out.println(i);
        }
    }

}

Met als uitkomst:

1
2

Je ziet dat de 3, 4 en 5 niet meer door System.out.println(i) wordt weergeven, doordat de loop wordt afgebroken, nadat de break statement wordt uitgevoerd wanneer i gelijk is aan 3.

Wanneer je meerdere loops in een blok hebt (nested loops) en je vanuit de binnenste loop helemaal naar buiten wilt komen, dan kun je een label: gebruiken in combinatie met de break statement.

public class Klasse {

    public void methode() {
        int i = 0;

        // De while statement met de label "buiten".
        buiten: while (i++ < 5) {
            int j = 0;

            // De while statement met de label "binnen".
            binnen: while (j++ < 5) {
                if (i == 3) {
                    break buiten;
                }
                if (j == 3) {
                    break binnen;
                }

                System.out.println(i + "," + j);
            }
        }
    }

}

Met als uitkomst:

1,1
1,2
2,1
2,2

De continue statment:

Met de continue statment kun je binnen alle herhaal statementen bepalen wanneer de loop overgeslagen moet worden, zonder dat de rest van de loop statement wordt uitgevoerd. Binnen de herhaal statementen while, for en do-while gedraagt de continue statement zich hetzelfde, hier wordt dan ook enkel een voorbeeld met de while statement gegeven:

public class Klasse {

    public void methode() {
        int i = 0;

        // De while statement met een continue statement.
        while (i++ < 5) {
            if (i == 3) {
                continue;
            }
            System.out.println(i);
        }
    }

}

Met als uitkomst:

1
2
4
5

Je ziet dat de 3 niet meer door System.out.println(i) wordt weergeven, doordat de loop wordt overgeslagen, nadat de continue statement wordt uitgevoerd wanneer i gelijk is aan 3.

De return statment:

return variabele;

Met de return statment kun je een methode afsluiten en het antwoord in de vorm van een variabele laten geven. De datatype of de klasse van de variabele moet overeenkomen met de element type van de methode. Wanneer je geen variabele meegeeft aan de return statment of helemaal geen return statment gebruikt, dan zal de methode als void gedeclareerd moeten worden.

public class Klasse {

    public int i = 0;

    // Deze methode geeft geen antwoord in de vorm van een return statement
    // en wordt derhalve met de element type "void" gedeclareerd.
    public void methode1() {

        // Schrijf de resultaat naar de systeem console. Let op: dit is
        // géén antwoord, maar een uitvoer (output).
        System.out.println(++i);

        // Je kunt een "void" methode wel halverwege laten afbreken met een lege
        // return statement. Dit is echter niet nodig aan het einde van de methode.
        return; // Deze kun je dus eigenlijk gewoon weglaten.
    }

    // Deze methode geeft een "int" als antwoord en wordt derhalve met de
    // element type "int" gedeclareerd.
    public int methode2() {

        // Beantwoord door de variabele i terug te geven.
        return ++i;
    }

    // Je kunt wel meerdere return statementen in een code blok hebben.
    // Let op: de break statementen zijn logischerwijs overbodig geworden.
    public String getHuidigeVersnelling(int i) {
        switch (i) {
            case 1:
                return "Dit is de eerste versnelling.";
            case 2:
                return "Dit is de tweede versnelling.";
            case 3:
                return "Dit is de derde versnelling.";
            case 4:
                return "Dit is de vierde versnelling.";
            case 5:
                return "Dit is de vijfde versnelling.";
            default:
                return "Deze versnelling is onbekend.";
        }
    }

}

Even testen. Dit kun je in een IDE uitvoeren, zoals Lomboz, zie ook Introductie - Hello World.

public class Test {

    public static void main(String[] args) {

        // Declareer en instantieer Klasse.
        Klasse klasse = new Klasse();

        // Voer methode1() uit.
        klasse.methode1();

        // Schrijf het antwoord van methode2() alsnog naar de systeem console.
        System.out.println(klasse.methode2());

        // Schrijf het antwoord van getHuidigeVersnelling() alsnog naar de
        // systeem console, met als parameter het antwoord van methode2().
        System.out.println(klasse.getHuidigeVersnelling(klasse.methode2()));
    }

}

Dit geeft als uitkomst:

1
2
Dit is de derde versnelling.

Ja, deze uitkomst is correct ;)

Terug naar boven


In het volgende hoofdstuk wordt behandeld hoe je potentiële fouten kunt afvangen, onderdrukken danwel doorgooien: Foutenafhandeling.

Copyright - Niets van deze pagina mag worden overgenomen zonder uitdrukkelijke toestemming.

(C) April 2006, BalusC

2 comments:

renske said...

Hoe komt het dat bij de while functie "i" tot 5 kan komen en bij 1 begint, terwijl bij de for functie die "i" bij 0 begint tot 4?
In principe moeten ze aan de zelfde functie voldoen toch?

BalusC said...

Renske: in de while functie wordt de waarde van i met behulp van de postfix incrementele operator i++ toegenomen met 1 voordat het in de statementblok wordt gebruikt. In de for functie gebeurt dat pas nadat de statementblok is afgerond.