Az Ember exceptiont dob

Ez az egész exceptionosdi nagyon praktikus lesz a Kocsma dologhoz! Eddig ha valaki kidőlt, durván megállítottuk a programot. Még azt sem tudtuk, hogy melyik italnál dőlt ki, mert mindem csak úgy hopp, megállt.

Most ahelyett, hogy kiírogatnánk bármit, egyszerűen dobjunk egy exceptiont, ha túl sokat ivott egy Ember:

public class Ember {
    double fogyasztottAlkohol=0;
    double alkoholTures=1;
    String nev;
    double ivottMennyiseg=0;

    Ember(String nev,double alkoholTures) {
        this.nev=nev;
        this.alkoholTures=alkoholTures;
    }


    void igyal(Innivalo innivalo) {
        fogyasztottAlkohol+=innivalo.felszolgaltMeret*innivalo.alkoholTartalomSzazalek/100;

        if (fogyasztottAlkohol>alkoholTures) {
            // ez itt az exception
            throw new RuntimeException("Jajj, ez sok volt! "+nev+" kidolt!"); 
        }

        ivottMennyiseg+=innivalo.felszolgaltMeret;
        if (ivottMennyiseg>10) { // ez akkor 1 liter, mert deciben számolunk
            // ez itt az exception
            throw new RuntimeException(nev+" most feladta, mert szünetre van szüksége!"); 
        }

    }
}

Na futtassuk le a kocsma szimulációt, és lám:

Jacknak a két sör után a pálesz már túl sok folyadék

Mivel senki nem kapta el az exception-t, ezért a program megáll, és az exception szövege kiíródik a konzolra.

A call stack

A programunk úgy futott, hogy a Kocsma osztályból egy Ember példány (jack) meghívta az igyal() metódust, aminek a belsejében dobtuk az exception-t.

A java mindezt a folyamatot kiírja az exception alá, így lehet követni, hogy honnan jutott el a program addig, hogy ilyen hibát dobjon. Ezt a listát úgy nevezik, hogy exception stack. (Magyarul "kivétel verem" - jajj, magyarul senki sem fogja megérteni, angolul meg a többmillió programozó ugyanígy hívja!)

A kék részek tartalmazzák a programrész nevét, és a sorszámát. Ha rákattintasz, a szerkesztő arra a sorra ugrik, ami a listában van. Például a legutolsó Kocsma.java:13-ra kattintva a Kocsma 13-as sorára megy, ami az utolsó pálesz elfogyasztásáról szól, ami már túl soknak bizonyult.

Azt is látod, hogy az exception utáni rész, a többi ivás már nem futott le, így látod, hogy Jack 2 sört, Jane 1 páleszt már megivott, és Jack következő pálinkája volt az, ami már szünetet követelt.

Persze, ehhez látnod kell a program kódját... A következő részben ezt kissé kiokosítjuk, hogy ha bárki kidőlt, pontosan mutassa meg a program, hogy ki mit ivott és ki hol tart a versenyben.

Bátran használjunk exception-t!

Ha valami okból a mi programunk sem folytatható, dobjunk egy exception-t.