Objektum Orientált Programozás 11. Kivételkezelés 44/1B IT MAN B IT v: 2016.05.03 MAN
Pici elmélet A Java kivételkezelésének célja a programfutás során keletkezett hibák kiszűrése és megfelelő kezelése. Az ilyen hibákat a Java platformon Exception-nek (kivételnek) nevezik. Két fő csoportjuk van: a futási időben és a nem futási időben keletkezett kivételek. Futásidejű kivételek az aritmetikai (pl. nullával való osztás), az indexeléssel kapcsolatos (pl. tömb nem létező eleméhez való hozzáférés), és a referenciával kapcsolatos (pl. objektumokra való hivatkozás) kivételek. Ezeket a kivételeket nem kötelező implementálni, de erősen ajánlott. 44/2 B IT MAN
Pici elmélet Nem futásidejű kivételek a Java rendszerén kívül keletkeznek. Ilyenek az I/O műveletek során keletkező hibák (pl. a fájl nem található). Ezeket a kivételeket kötelező lekezelni. Amikor a kód futása során valamilyen hiba lép fel (pl. nullával való osztás, indexhatár túllépése ), akkor egy kivételobjektum (egy kivételosztály példánya) jön létre. Ez az objektum olyan információkat tartalmaz a kivétel fajtájáról és a program aktuális állapotáról, amelyeket a kivétel lekezelésekor felhasználhatunk. A kivételobjektum létrehozását és a futtatórendszer által történő lekezelését kivételdobásnak hívjuk. 44/3 B IT MAN
Kód belépési pont try { X kód, ami kiválthat egy kivételt catch ( Kivétel típusa Azonosító ) { Kód kilépési pont kód, ami lekezel egy kivételt 44/4 B IT MAN
Pici elmélet A védett kódot try blokkban helyezzük el: try { utasítások Az első kivételt kiváltó utasítással befejeződik a try blokk végrehajtása, létrejön egy kivétel objektum. Fontos: a try blokk kivételt kiváltó utasítása utáni utasítások tehát mindig kimaradnak! try { X kód, ami kiválthat egy kivételt további utasítások catch ( Kivétel típusa Azonosító ) { 44/5 B IT MAN
Pici elmélet A kivétel lekezelését szolgáló utasítások catch blok(kok)ban helyezkednek el. catch (típus, azonosító) { utasítások A catch minden esetben a try blokkot követi, nem lehet köztük más utasítás. Egy try blokkhoz tartozhat több catch is. Mindig a szűkebb kivételt követi a bővebb kivétel lekezelése. catch ( Kivétel típusa Azonosító ) { kód, ami lekezel egy kivételt catch ( Kivétel típusa Azonosító ) { 44/6 B IT MAN kód, ami lekezel egy kivételt
Pici elmélet finally: A cacth(ek) után szerepelhet. Az utolsó catch blokk és a finally blokk között nem lehet más utasítás. Minden esetben lefut: Ha kivétel keletkezett a try blokkban, egy catch blokk végrehajtása után. Ha nem volt kivétel, a try blokk utolsó utasítása után. try { X catch ( Kivétel típusa Azonosító ) { finally { kód, ami kiválthat egy kivételt kód, ami lekezel egy kivételt kód, ami mindig lefut 44/7 B IT MAN
Pici elmélet A kivétel objektum adatai kiírathatók: getclass() metódus: mely visszaad egy sztringet, ami a kivétel osztály azonosítóját tartalmazza, getmessage() metódus: visszaadja a kivételt kiváltó sztringet, tostring() metódus: mely visszaad egy sztringet, ami a kivétel osztály azonosítójából és a kivételt kiváltó sztringből áll. printstack() metódus: kiírja a keletkezett kivételeket, a keletkezésük sorrendjében és megadja a keletkezésük helyét. 44/8 B IT MAN
Feladatok 1. Készítsen egy futtatható osztályt, amelyben beolvas a konzolról egy egész számot és kiírja. Kezelje az esetlegesen felmerülő hibákat kivételkezeléssel. JavaKiv1.java Hibakezelés nélkül import java.util.scanner; public class JavaKiv1 { public static void main(string[] args) { Scanner sc = new Scanner(System.in); System.out.println("Kérek egy osztályzatot: "); String s1 = sc.nextline(); int jegy = Integer.parseInt(s1); System.out.println("Az osztályzat: "+jegy); 44/9 B IT MAN
Kérek egy osztályzatot: r5 Konzol Exception in thread "main" java.lang.numberformatexception: For input string: "r5" at java.lang.numberformatexception.forinputstring(unknown Source) at java.lang.integer.parseint(unknown Source) at java.lang.integer.parseint(unknown Source) at JavaKiv1.main(JavaKiv1.java:9) 44/10 B IT MAN
JavaKiv1.java Hibakezeléssel import java.util.scanner; public class JavaKiv1 { public static void main(string[] args) { Scanner sc = new Scanner(System.in); System.out.println("Kérek egy osztályzatot: "); String s1 = sc.nextline(); try { int jegy = Integer.parseInt(s1); System.out.println("Az osztályzat: "+jegy); catch (NumberFormatException nfe) { System.out.println("Hiba: "+nfe.getmessage()); //System.out.println("Hiba: "+nfe); //nfe.printstacktrace(); 44/11 B IT MAN
Konzol nfe.getmessage() Kérek egy osztályzatot: f5 Hiba: For input string: "f5" Konzol nfe Kérek egy osztályzatot: f5 Hiba: java.lang.numberformatexception: For input string: "r5" Konzol nfe.printstacktrace() Kérek egy osztályzatot: r5 java.lang.numberformatexception: For input string: "r5" at java.lang.numberformatexception.forinputstring(unknown Source) at java.lang.integer.parseint(unknown Source) at java.lang.integer.parseint(unknown Source) at JavaKiv1.main(JavaKiv1.java:8) 44/12 B IT MAN
2. Készítsen egy futtatható osztályt, amelyben beolvas a konzolról egy egész számot és kiírja. Hiba esetén írjon ki üzenetet a kezelőnek, és újra kérje a számot. JavaKiv2.java import java.util.scanner; public class JavaKiv2 { public static void main(string[] args) { Scanner sc = new Scanner(System.in); int jegy =0; boolean kesz = false; do { try { System.out.println("Kérek egy osztályzatot: "); String s1 = sc.nextline(); jegy = Integer.parseInt(s1); System.out.println("Az osztályzat: "+jegy); kesz = true; catch (NumberFormatException nfe) { System.out.println("Nem megfelelő adat! Próbáld újra!"); while (!kesz); 44/13 B IT MAN
Konzol Kérek egy osztályzatot: r5 Nem megfelelő adat! Próbáld újra! Kérek egy osztályzatot: 3.8 Nem megfelelő adat! Próbáld újra! Kérek egy osztályzatot: 18 Az osztályzat: 18 44/14 B IT MAN
Pici elmélet Saját kivétel osztály: Az Exception leszármazotja legyen. Név konvenció! (ValamiException) A konstuktorának a paraméterei között legyen egy String, amivel az ősosztály konstruktorát hívja meg. A metódusai a catch blokkban használhatók a kivétel lekezelése során. public class PeldaException extends Exception { public PeldaException(String a) { super(a); 44/15 B IT MAN
Pici elmélet A kivétel megdobása (kiváltása), elkapása: public class proba2 { public static void main(string[] args) { try { throw new PeldaException("Leiras"); catch (PeldaException e){ System.out.println(e.getMessage()); 44/16 B IT MAN
Feladatok 3. Készítsen egy SkKiv nevű saját kivétel osztályt: - Adattag: jegy, amely egy beolvasott osztályzatot tárolja, - Metódus: tostring, adja vissza: 'Nem érvényes osztályzat: ' Készítsen egy futtatható osztályt, amelyben beolvas a konzolról egy egész számot és kiírja. Kezelje a következő kivételeket: - Az osztályzat nem lehet 1-től kisebb! - Az osztályzat nem lehet 5-től nagyobb! - Az osztályzatnak egész számnak kell lennie. Hiba esetén írjon ki üzenetet a kezelőnek, és kérje újra a számot. 44/17 B IT MAN
SkKiv osztály SkKiv.java public class SkKiv extends Exception{ int jegy; public SkKiv(int jegy, String uzenet){ super (uzenet+" Beolvasott érték: "+jegy); this.jegy = jegy; public String tostring(){ return "Nem érvényes osztályzat: "; 44/18 B IT MAN
JavaKiv3.java (2/1) import java.util.scanner; public class JavaKiv3 { public static void main(string[] args) { Scanner sc = new Scanner(System.in); int jegy =0; boolean kesz = false; do { try { System.out.println("Kérek egy osztályzatot: "); String s1 = sc.nextline(); jegy = Integer.parseInt(s1); if (jegy < 1) throw new SkKiv(jegy, "A jegy nem lehet 1-től kisebb!"); if (jegy > 5) throw new SkKiv(jegy, "A jegy nem lehet 5-től nagyobb!"); System.out.println("Az osztályzat: "+jegy); kesz = true; catch (SkKiv ske) { 44/19 B IT MAN
JavaKiv3.java (2/1) catch (SkKiv ske) { System.out.println(ske+ske.getMessage()); catch (NumberFormatException nfe) { System.out.println("Nem megfelelő adat! Próbáld újra!"); while (!kesz); 44/20 B IT MAN
Konzol Kérek egy osztályzatot: 8 Nem érvényes osztályzat: A jegy nem lehet 5-től nagyobb! Beolvasott érték: 8 Kérek egy osztályzatot: 0 Nem érvényes osztályzat: A jegy nem lehet 1-től kisebb! Beolvasott érték: 0 Kérek egy osztályzatot: 2.5 Nem megfelelő adat! Próbáld újra! Kérek egy osztályzatot: a+ Nem megfelelő adat! Próbáld újra! Kérek egy osztályzatot: 4 Az osztályzat: 4 44/21 B IT MAN
Feladatok 4. Tároljunk be számokat egy szöveges tömbbe, legyen benne hibás is. Próbáljuk berakni a számokat egy egész típusú tömbbe, aztán írassuk ki a tömb adatait a képernyőre. Alkalmazzunk hibakezelést ott, ahol szükséges. 44/22 B IT MAN
JavaKiv4.java public class JavaKiv4 { public static void main(string[] args) { int j=0; String [] tk = {"12", "34", "a56", "78", "90", "123"; Integer [] egesz = new Integer[5]; for (j=0; j<6; j++) System.out.println(tk[j]); System.out.println("==============="); for (j=0; j<5; j++) { egesz[j] = new Integer(tk[j]); System.out.println("==============="); for (j=0; j<6; j++) { System.out.println(Integer.valueOf(egesz[j])); 44/23 B IT MAN
Konzol 12 34 a56 78 90 123 Exception in thread "main" =============== java.lang.numberformatexception: For input string: "a56" at java.lang.numberformatexception.forinputstring(unknown Source) at java.lang.integer.parseint(unknown Source) at java.lang.integer.<init>(unknown Source) at JavaKiv4.main(JavaKiv4.java:11) 44/24 B IT MAN
JavaKiv4.java (Kódrészlet!) System.out.println("==============="); for (j=0; j<5; j++) { try { egesz[j] = new Integer(tk[j]); catch (NumberFormatException nf) { System.out.println(j+1 +". adat hibás: "+tk[j]); System.out.println("==============="); for (j=0; j<6; j++) { System.out.println(Integer.valueOf(egesz[j])); 44/25 B IT MAN
Konzol 12 34 a56 78 90 123 =============== 3. adat hibás: a56 =============== 12 34 Exception in thread "main" java.lang.nullpointerexception at JavaKiv4.main(JavaKiv4.java:16) 44/26 B IT MAN
JavaKiv4.java (Kódrészlet!) System.out.println("==============="); for (j=0; j<6; j++) { try { System.out.println(Integer.valueOf(egesz[j])); catch (NullPointerException np) { System.out.println(j+1 + ". elemnek nincs értéke!"); 44/27 B IT MAN
Konzol 34 a56 78 90 123 =============== 3. adat hibás: a56 =============== 12 34 3. elemnek nincs értéke! 78 90 java.lang.arrayindexoutofboundsexception: 5 at JavaKiv4.main(JavaKiv4.java:17) 44/28 B IT MAN
JavaKiv4.java (Kódrészlet!) System.out.println("==============="); for (j=0; j<6; j++) { try { System.out.println(Integer.valueOf(egesz[j])); catch (NullPointerException np) { System.out.println(j+1 + ". elemnek nincs értéke!"); catch (ArrayIndexOutOfBoundsException ob) { System.out.println(j+1 +". index a tömb méretén kívül!"); 44/29 B IT MAN
Konzol 12 34 a56 78 90 123 =============== 3. adat hibás: a56 =============== 12 34 3. elemnek nincs értéke! 78 90 6. index a tömb méretén kívül! 44/30 B IT MAN
Már megint lefagyott a Windows!! Menjetek gyerekek, segítsetek apátoknak megnyomni a CTRL + ALT + DEL-t! 44/31 B IT MAN
44/32 B IT MAN
44/33 B IT MAN
44/34 B IT MAN
44/35 B IT MAN
44/36 B IT MAN
44/37 B IT MAN
44/38 B IT MAN
44/39 B IT MAN
44/40 B IT MAN
44/41 B IT MAN
44/42 B IT MAN
44/43 B IT MAN
VÉGE VÉGE 44/44 B IT MAN