11. Javan valintarakenteet 11.1
Sisällys If- ja if-else-lauseet. Orpo else. Valintaa toisin: switch-lause. 11.2
If-lause Merkitään varatulla sanalla if. Kuvaa yksisuuntaisen päätöksen: rakenteen lauseet suoritetaan vain ehdon ollessa totta. toteutuessa. false true Aaltosulkeet voidaan jättää pois, jos rakenteeseen liittyy vain yksi lause. if () { 11.3
If-lause public class Vertailija1 { public static void main(string[] args) { // Vertailtavat arvot. int x; int y; if (x == y) { // Tulostetaan, jos x ja y ovat yhtä suuret. System.out.println(x + " == " + y); 11.4
If-else-lause Merkitään varatuilla sanoilla if ja else. Kuvaa kaksisuuntaisen päätöksen: if-osaan liittyvät lauseet suoritetaan ehdon ollessa totta, muuten suoritetaan else-osaan liittyvät lauseet. Else-osalla ei ole omaa ehtoa. true if () { else { false 11.5
If-else-lause public class Vertailija2 { public static void main(string[] args) { if (x == y) { // Tulostetaan, jos x ja y ovat yhtä suuret. System.out.println(x + " == " + y); else { // Tulostetaan, kun x ja y ovat erisuuret. System.out.println(x + "!= " + y); 11.6
Sisäkkäiset valinnat Monisuuntaiset päätökset voidaan ilmaista sisäkkäisillä päätöksillä. Sisennysten merkitys ohjelman rakenteen selkeyttäjänä korostuu rakenteiden monimutkaistuessa. Oheinen rakenne (Vertailija3) ilmaisee kolmisuuntaisen päätöksen. // Ulompi rakenne. if (x < y) { System.out.println(x + " < " + y); else { // Sisempi rakenne. if (x == y) { System.out.println(x + " == " + y); else { // Totta, kun ehdot epätosia. System.out.println(x + " > " + y); 11.7
Peräkkäiset valinnat Sisäkkäiset valintarakenteet voidaan korvata peräkkäisillä valinnoilla, jos rakenteiden ehdot sulkevat toisensa pois. // (x == y) == false ja (x > y) == false if (x < y) { System.out.println(x + " < " + y); // (x < y) == false ja (x > y) == false if (x == y) { System.out.println(x + " == " + y); // (x < y) == false ja (x == y) == false if (x > y) { System.out.println(x + " > " + y); 11.8
Ole tarkkana operaattoreiden kanssa Ehtolausekkeessa voidaan tehdä vahingossa sijoitus, koska sijoitusoperaattori (=) palauttaa sijoitetun arvon. boolean teese; // Päätellään pitäisikö tehdä // vai ei: muuttujan arvoksi // asetetaan true, jos tehdään. // Virhe. Tehdään aina. if (teese = true) // Virhe. Ei tehdä koskaan. if (teese = false) // Oikein, mutta epähuomiossa // tehty virhe on mahdollinen. if (teese == true) if (teese == false) // Oikein. Virhettä ei voida tehdä, // koska operaattoreita ei käytetä. if (teese) 11.9
Orpo else Valintarakenteita yhdistettäessä ei ole aina selvää mihin ifosaan else-osa liittyy. Orpo else -ongelma (dangling else): Onko lause x; else lause y; lause x; vai lause x; else else lause y; lause y; 11.10
Orpo else Javassa orpo else-osa liittyy aina lähimpään vapaaseen if-osaan. else lause x; lause y; Koottuja lauseita käyttämällä voidaan vaikuttaa oletussuoritusjärjestykseen. Koodia muotoilemalla ei voida määrätä mihin ifosaan orpo else liittyy. 11.11
Orpo else lause x; else lause y; Else liittyy jälkimmäiseen if-osaan. { lause x; else lause y; Else liittyy ensimmäiseen if-osaan. 11.12
switch-lause switch (arvo) { case vakio 1: lause k;... case vakio 2: lause l;...... default: lause m;... Valinta arvojen tai vakioiden avulla. Arvon oltava char, byte, short tai int. Javan 1.7-versiosta alkaen String-tyyppi sallittu. Jos break-lause puuttuu jostakin valinnasta, niin tästä kohdasta alkanut suoritus jatkuu, kunnes kohdataan seuraava break-lause tai valintarakenne loppuu. break-lauseen unohtuminen jostakin valinnasta on varsin yleinen ohjelmointivirhe. default-osa suoritetaan, jos mitään muuta lauseen osaa ei suoriteta. Lause sopii hyvin erilaisten valikoiden toteuttamiseen. 11.13
switch-lause // Ohjelma, jossa on valikko. public class Rekisteri { public static void main(string[] args) { // Ohjelman tuntemat komennot vakioina. final char LISAA = 'l'; final char POISTA = 'p'; final char HAE = 'h'; final char LOPETA = 'e'; // Muuttuja, johon luetaan käyttäjän // näppäimistöltä antama valinta. char valinta; // Valitaan toiminto if-else-rakenteilla. if (valinta == LISAA) { System.out.println("Lisään..."); else if (valinta == POISTA) { System.out.println("Poistan..."); else if (valinta == HAE) { System.out.println("Haen..."); else if (valinta == LOPETA) { System.out.println("Lopetan..."); else System.out.println("Virhe."); 11.14
switch-lause // Valitaan toiminto switch-rakenteella. switch (valinta) { case LISAA: System.out.println("Lisään..."); case POISTA: System.out.println("Poistan..."); case HAE: System.out.println("Haen..."); case LOPETA: System.out.println("Lopetan..."); default: System.out.println("Virhe."); 11.15