UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás I. 7. gyakorlat
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Standard IO Standard input: System.in Standard output: System.out Standard error: System.err System.out és System.err közvetlenül használhatóak
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Beolvasás billentyűzetről java.util.Scanner Különböző típusokat olvashatunk egy adott forrásból (pl. alapértelmezett bemenetről) Scanner sc = new Scanner(System.in); int i = sc.nextInt(); //primitív típusok támogatva String str = sc.next(); //String beolvasása
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Kivételkezelés A fordítás során nem derülhet ki minden hiba (IO műveletek, felhasználói interakciók, stb.) Kivétel (exception): egy olyan probléma, amely meggátolja a futást egy adott metódusba, vagy blokkban Pl. null referenciára hivatkozás Kivétel keletkezésekor: Az adott kódrész végrehajtása megáll, kivétel dobódik A kivételkezelő mechanizmus megpróbál keresni egy megfelelő kivételkezelőt Ha található, az lekezeli a hibát, a program futhat tovább. Különben a program teljes végrehajtása megállhat.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Kivételkezelés Kivétel elkapása: Ha valahol kivétel dobódhat, az jó esetben máshol el is lesz kapva Védett régió: A kód azon része, mely kivételeket hozhat létre. try blokkal jelezhetjük try { … } Hibakezelő kód követi: catch(Exception e) { … }
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Kivételkezelés Pl: try { //Veszélyes kódrészlet, amely kivételt dobhat int a = 500; int b = 0; int c = (a/b)*5; } catch(ArithmeticException ae) { //Elkaptuk a kivételt, mi történjen? ae.printStackTrace(); }
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Kivételkezelés Egy try blokkhoz több catch blokk is tartozhat Ezeknél jelezzük, hogy az adott blokk milyen típusú kivételt tud elkapni catch (Exception e) – általános (bármely) kivételt elkapja, használata nem ajánlott! try blokk végére finally blokkot is helyezhetünk. Ennek tartalma mindenképp lefut (akár volt hiba, akár nem). Itt érdemes lezárni kapcsolatokat, nyitt fájlokat… Nem kötelező a használata, de általában ajánlott
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Kivételkezelés try {... } catch (ArithmeticException ae) { … } catch (IOException ioe){ … } catch (Exception e){ … } finally { }
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Exception osztály Minden kivétel az Exception osztályból származik Pl: ArithmeticException (pl. 0-val osztás) ArrayIndexOutOfBoundsException (tömb indexelés) IllegalArgumentException IOException NullPointerException ClassNotFoundException
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS RuntimeException Azon kivételek őse, melyeket a virtuális gép dobhat működés közben. Az ebből származó kivételeket nem szokás elkapni. Ha ilyet kapunk, az jó eséllyel programozási hiba következménye. NullPointerException ArrayIndexOutOfBoundsException
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS RuntimeException Azon kivételek őse, melyeket a virtuális gép dobhat működés közben. Az ebből származó kivételeket nem szokás elkapni. Ha ilyet kapunk, az jó eséllyel programozási hiba következménye. NullPointerException ArrayIndexOutOfBoundsException
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Throwable Object osztályból származik (mint minden…) Két leszármazottja: Exception: eddig ezekről volt szó (kivételek) Error: fordítási időbeni és rendszerhibák. Ezeket általában nem kell lekezelni (fordítási hibát pl. a program kijavításával kezelhetjük le, nem kivételkezeléssel).
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Throws Ha egy metódus kivételt dobhat, throws kulcsszóval jelezhetjük ezt. Jelentése: az adott kivétel a metódusban nincs lekezelve, a metódust hívó programrésznek kell vele foglalkoznia. Több kivételt is fel lehet sorolni Sokszor kötelező (fordítási hibát okozhat, ha nem írjuk ki) public void fajlbolOlvasas() throws IOException { … }
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Sajtát típusú kivétel Származtatni kell egy kivételből. Bármely (általában az Exception) osztályból származhat. public class SajatKivetel extends Exception { public SajatKivetel(String message){ super(message); }
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Throw Nem ugyanaz, mint a throws!!! Kivételt dobhatunk vele „manuálisan” Pl. if (x < 0) { throw new SajatKivetel(„X negatív szám”); } Ha throw segítségével kivételt dobhat a metódusunk, azt vagy kötelezően jelezni kell a throws kulcsszóval… Vagy try-catch blokkba tehetjük az adott kódrészletet (ez ritkább eset) Különben fordítási hiba
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS throw vs. throws Throws: metódus fejlécében jelezzük, milyen hibákat dobhat. Throw: a kódrészletben valahol konkrétan dobunk egy kivételt. public void foo(throws SajatKivetel { int a=3; int b=0; if (b==0) { throw new SajatKivetel("Nulla az osztó"); } else { System.out.println((double)a/b); } } Példaprogram pubban: SajatKivetel.java, Hiba.java
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Belső osztályok Osztályon vagy metóduson belül is létrehozhatunk osztályokat. Célja, hogy az egyedileg használt algoritmusokat elrejtsük más osztályok elől. A belső osztályból elérhetőek a külső osztály elemei, kivéve ha a belső osztály static! Egy külső osztály láthatósága csak public vagy package private lehet. A belső osztályé viszont bármi, sőt, akár statikus is lehet! Nem kell külön fordítani a belső osztályokat.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Belső osztályok Osztályon belüli osztály: public class Kulso {.. private class Belso{ … } … }
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Belső osztályok Metóduson belüli osztály: public void ezEgyMetodus() {.. private class Belso{ … } … }
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Belső osztály példányosítása A tartalmazó osztályon belül ugyanúgy, mint eddig. A tartalmazón kívül (ha elérhető az osztály láthatóság alapján): Kulso.Belso peldany = new Kulso.Belso(); Ha nem statikus a belső osztály, objektum példányon keresztül hozható létre: Kulso peldanyKulso = new Kulso(); Kulso.Belso peldanyBelso = peldanyKulso.new Belso();
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Feladat (közösen) Közösen: hozzunk létre egy láncolt lista tárolására alkalmas osztályt. Tároljuk az aktuális elem értékét (egyelőre csak egész számokat, jövő órán kiegészítjük generikus megoldással), valamint mutassunk a következő elemre. Valósítsuk meg a beszúró és törlő műveleteket (lista elejére beszúr, lista elejéről töröl) toString() metódusban valósítsuk meg a lista elemenkénti kiíratását.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Feladat (plusz pontért) Hozz létre egy fix méretű vermet egész számok tárolására (tömb segítségével) és valósítsd meg a push/pop műveleteket. D Írj egy futtatható osztályt, mely a Main metódusban „push” vagy „pop” utasításokat vár a konzolról. Ha pop utasítást kap, hajtsa végre azt, és írja ki a konzolra a kivett elemet. Push utasítás esetén egy egész számnak kell következnie, ezt tegye be a verembe. Írj meg egy kivételosztályt, amit a fenti függvények (push/pop) akkor dobnak, ha a verem megtelt vagy üres.