Most már mindennel fel vagyunk vértezve, hogy az Ember tudja követni, mit ivott.
Ezt fogjuk csinálni:
az Embernek lesz egy konténere, amiben nem String-ek, hanem Innivalo-k vannak
ha bármit megitatnak az Emberrel, azt betesszük a konténerbe
a Kocsma-ban elkapjuk az exceptiont ha valaki kidől
és ekkor jól kiírjuk, hogy ki hol tart az ivásban
Vágjunk bele! Vedd elő az előző részben készült kocsma programot! Itt tartottunk, összesen hat pici osztály, ami leírja a kocsma működését:
public class Innivalo {
double felszolgaltMeret=5; // dl
double alkoholTartalomSzazalek=4; // %
Innivalo(double felszolgaltMeret,double alkoholTartalomSzazalek) {
this.felszolgaltMeret=felszolgaltMeret;
this.alkoholTartalomSzazalek=alkoholTartalomSzazalek;
}
}
public class Bor extends Innivalo {
Bor() {
super(1,12); // 1 dl, 12%
}
}
public class Sor extends Innivalo {
Sor() {
super(5,4); // 5 dl, 4%
}
}
public class Palinka extends Innivalo {
Palinka() {
super(0.5,40); // 0.5 dl, 40%
}
}
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!");
}
}
}
public class Kocsma {
public static void main(String[] args) {
Ember jack=new Ember("Jack",1.2);
Ember jane=new Ember("Jane",1);
jack.igyal(new Sor());
jack.igyal(new Sor());
jane.igyal(new Palinka());
jack.igyal(new Palinka());
jack.igyal(new Palinka());
jane.igyal(new Bor());
}
}
Az Ember osztályt kell felokosítani, hogy emlékezzen, mit ivott:
public class Ember {
double fogyasztottAlkohol=0;
double alkoholTures=1;
String nev;
double ivottMennyiseg=0;
// ez a konténer
List<Innivalo> innivalok=new ArrayList<>();
Ember(String nev,double alkoholTures) {
this.nev=nev;
this.alkoholTures=alkoholTures;
}
void igyal(Innivalo innivalo) {
// eltároljuk hogy mit ivott
innivalok.add(innivalo);
fogyasztottAlkohol+=innivalo.felszolgaltMeret*innivalo.alkoholTartalomSzazalek/100;
if (fogyasztottAlkohol>alkoholTures) {
throw new RuntimeException("Jajj, ez sok volt! "+nev+" kidolt!");
}
ivottMennyiseg+=innivalo.felszolgaltMeret;
if (ivottMennyiseg>10) { // ez akkor 1 liter, mert deciben számolunk
throw new RuntimeException(nev+" most feladta, mert szünetre van szüksége!");
}
}
}
Ugye nem tévedtél el benne? Két értelmes sort írtam hozzá:
// ez a konténer
List<Innivalo> innivalok=new ArrayList<>();
// eltároljuk hogy mit ivott
innivalok.add(innivalo);
A kocsmában az ivásokat tegyük egy try..catch közé, és ha jött egy exception, akkor:
public class Kocsma {
public static void main(String[] args) {
Ember jack=new Ember("Jack",1.2);
Ember jane=new Ember("Jane",1);
try {
jack.igyal(new Sor());
jack.igyal(new Sor());
jane.igyal(new Palinka());
jack.igyal(new Palinka());
jack.igyal(new Palinka());
jane.igyal(new Bor());
jack.igyal(new Palinka());
jack.igyal(new Sor());
jack.igyal(new Palinka());
jack.igyal(new Sor());
} catch (Exception e) {
System.out.println(e.getMessage());
}
System.out.println("Jack ezt itta:");
for (Innivalo innivalo:jack.innivalok) {
System.out.println(" "+innivalo);
}
System.out.println("Jane ezt itta:");
for (Innivalo innivalo:jane.innivalok) {
System.out.println(" "+innivalo);
}
}
}
Ehhez is mindent tudtál, igaz? Egy Exception-nak van egy getMessage metódusa, ami visszaadja az exception szövegét, ezt írjuk ki. Mivel elkaptuk az exception-t, az nem állítja le a programot, és megy tovább, ahol két for-each ciklussal kiírjuk, hogy ki mit ivott. Trallala, nem is volt nehéz, ugye?
Jack most feladta, mert szünetre van szüksége!
Jack ezt itta:
Sor@15db9742
Sor@6d06d69c
Palinka@7852e922
Jane ezt itta:
Palinka@7852e922
No, várjunk csak, mi az hogy Palinka@7852e922? Én ilyet ugyan sehova sem írtam! Honnan veszi ezt? De mit is csinálok? Kiírom az innivalot. Az innivalo nem primitív típus, nincs egyetlen értéke, akkor most mit írjon ki?
System.out.println(" "+innivalo);
A rejtély megoldása a következő oldalon...