1Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Programozás I. 7. gyakorlat
Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor2Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Standard IO Standard input: System.in Standard output: System.out System.out.println(”Szöveg”); Standard error: System.err System.err.println(”Szöveg”); System.out és a System.err közvetlenül használhatóak Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor2
Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor3Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Beolvasás billentyűzetről java.util.Scanner Különböző típusokat olvashatunk be segítségével –Alapértelmezett bemenetről –Fájlból –Akár Stringből is Scanner sc = new Scanner(System.in); int i = sc.nextInt();//egész beolvasása String str = sc.next();//String beolvasása Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor3
Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor4Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Kivételkezelés Nem derül ki minden hiba a fordítás folyamán (IO műveletek, felhasználói interakció, stb.) Kivétel (exception): egy olyan probléma, amely meggátolja a futást egy adott metódusban vagy blokkban ( pl.: null referencia) Kivétel dobása: –a program végrehajtása megáll, kivétel dobódik –a kivételkezelő mechanizmus keres egy megfelelő kivételkezelőt –a kivételkezelő lekezeli a hibát, a program fut tovább Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor4
Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor5Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Kivételkezelés Kivétel elkapása: –ha valahol kivétel dobódhat, akkor feltételezzük, hogy ez valahol el lesz kapva Védett régió: –a kód azon része, amely kivételeket hozhat létre, ezt try blokkal jelezzük. try { … } –hibakezelő kód követi: catch(Exception e){ … } Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor5
Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor6Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Kivételkezelés 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(); } Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor6
Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor7Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Try-catch-finally Egy try blokkhoz több catch blokk is tartozhat –ezeket sorban megvizsgálja; mindegyik catch blokk adott típusú kivételt tud elkapni –a legelső catch el is kapja, amelyik képes rá át kell gondolni a catch blokkok sorrendjét catch(Exception nev) –általános kivételelkapó, ritkán használjuk! –minden kivételt elkap Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor7
Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor8Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Try-catch-finally A try-catch blokkok után még készíthetünk egy finally blokkot is A finally blokk tartalma mindenképpen lefut, függetlenül attól, hogy keletkezett-e hiba, vagy sem –Itt érdemes lezárni adatbázis kapcsolatot, megnyitott fájlokat, stb. –Használata nem kötelező de hasznos! Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor8
Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor9Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Try-catch-finally try {... }catch(ArithmeticException ae) { … }catch(IOException ioe){ … }catch(Exception e){ … } finally { } Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor9
Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor10Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Exception osztály Minden kivétel az Exception osztályból származnak néhány példa: –ArithmeticException (pl.: nullával való osztás) –ArrayIndexOutOfBoundsException (tömbindexelés) –IllegalArgumentException –IOException (IO műveletekkel kapcsolatos) –SQLException –NullPointerException –ClassNotFoundException Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor10
Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor11Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor RuntimeException azon kivételek őse, melyeket a virtuális gép dobhat a normál működése közben ezen osztályból származó kivételeket nem feltétlen kell elkapni, mert ha bekövetkeznek, akkor se tudunk sok mindent kezdeni velük (a program meghal) ilyen pl. a NullPointerException, ArrayIndexOutOfBoundsException Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor11
Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor12Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Throwable osztály Az Object osztályból származik ez az osztály is Két leszármazottja van –Exception: kivételek, eddig ezekről volt szó –Error: fordítási időbeni és rendszerhibák, ezekkel általában nem kell foglalkozni Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor12
Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor13Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor throws kulcsszó Ha egy metódus kivételt dobhat, akkor azt a throws kulcsszóval jelezhetjük Jelentése: a metódusban az adott kivétel nincs lekezelve, ezzel a hívó kódrészlet foglalkozik Több kivételt is fel lehet sorolni Sokszor kötelező (ha nincs, fordítási hiba) public void fajlbolOlvasas() throws IOException { … } Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor13
Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor14Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Saját kivétel létrehozása származtatni kell valamilyen létező kivételosztályból (pl.: Exception osztályból) public class SajatKivetel extends Exception { public SajatKivetel(String message){ super(message); } Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor14
Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor15Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor throw kulcsszó Nem ugyanaz, mint a throws!!!! kivételt dobhatunk vele manuálisan –pl.: if( x < 0 ) { throw new SajatKivetel(”X negatív szám”); } Ha saját kivételt dobunk, akkor jeleznünk kell a throws kulcsszóval, vagy try-catch blokkba kell tennünk a kódrészt –ha egyiket se tesszük, fordítási hibát fogunk kapni Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor15
Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor16Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor throws vs. throw throws: –metódus fejlécében jelezzük, hogy az adott metódus milyen hibákat dobhat throw: –a kódban egy helyen konkrétan dobunk egy hibát 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); } } Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor16 Példaprogram: SajatKivetel.java, Hiba.java
Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor17Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Belső osztályok Osztályon vagy metóduson belüli osztályok Cél: máshol nem használt algoritmusok teljes elrejtése A belső osztályból elérhetőek a „körülvevő” osztály elemei: –kivéve ha a belső osztály static Egy (nem belső) osztály láthatósága csak public vagy package private lehet, a belső osztály viszont ezen felül lehet private, protected, sőt static is nem kell őket külön fordítani Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor17
Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor18Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Belső osztályok Osztályon belüli belső osztály: public class Kulso {.. private class Belso{ … } … } Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor18
Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor19Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Belső osztályok metóduson belüli belső osztály: public void csinalValamit() { … private class Belso() { … } … } Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor19
Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor20Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Belső osztály példányosítása A tartalmazón belül ugyanúgy, mint eddig A tartalmazón kívülről: Kulso.Belso peldany = new Kulso.Belso(); csak nem statikus belső osztály esetén: Kulso peldanyKulso = new Kulso(); Kulso.Belso peldanyBelso = peldanyKulso.new Belso(); Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor20 Példaprogram: Lista.java, Lmain.java
Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor21Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Feladat 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 (legyen egész), 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. Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor21
Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor22Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Önálló feladat 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. Í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. Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor22