Java IX. telkezelés a Java-ban

Hasonló dokumentumok
Java IX. telkezelés a Java-ban

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Kivételkezelés a C++ nyelvben Bevezetés

Java programozási nyelv 9. rész Kivételkezelés

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Kivételek, kivételkezelés a C++ nyelvben

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

7. K: JAVA alapok Konzultáció

és az instanceof operátor

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Globális operátor overloading

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

Kivételek. A program végrehajtása során ritkán bekövetkező események Nem a fő végrehajtási ág ; logikailag alacsonyabbrendű feladat jelzése

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

Java VI. Miskolci Egyetem Általános Informatikai Tanszék. Utolsó módosítás: Ficsor Lajos. Java VI.: Öröklődés JAVA6 / 1

Kivételek kezelése (exception handling) Hibakezelés old style. Kivételkezelés

Objektumorientált programozás Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

Java programozási nyelv 4. rész Osztályok II.

Objektumorientált programozás C# nyelven

OOP: Java 8.Gy: Abstract osztályok, interfészek

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

Osztálytervezés és implementációs ajánlások

Osztálytervezés és implementációs ajánlások

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Java programozási nyelv 6. rész Java a gyakorlatban

Programozási nyelvek Java

Pénzügyi algoritmusok

Gregorics Tibor Modularizált programok C++ nyelvi elemei 1

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

Objektumorientált programozás C# nyelven

Java és web programozás

Abstract osztályok és interface-ek. 7-dik gyakorlat

Osztályok. 4. gyakorlat

Objektumorientált programozás C# nyelven

JAVA PROGRAMOZÁS 2.ELŐADÁS

S ha kettészelik is: balfelöl belőle Valamivel mindig - Valamivel mindiq több marad. (Nyugat )

OOP: Java 8.Gy: Gyakorlás

Programozási nyelvek Java

Objektumok inicializálása

Java V. Osztályszint. lyszintű ű tagok. Példányváltozó. Osztályváltozó. Általános Informatikai Tanszék Utolsó módosítás:

Bevezetés a Python programozási nyelvbe

Java programozási nyelv 5. rész Osztályok III.

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

A függvények névvel rendelkező utasításcsoportok, melyeknek információkat adhatunk át, és van egy visszatérési értékük.

Kivételkezelés, naplózás. Exception handling, logging

Java III. I I. Osztálydefiníció (Bevezetés)

Java és web programozás

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

Segédanyag: Java alkalmazások gyakorlat

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

Magas szintű programozási nyelvek 2 Előadás jegyzet

Java III. I I. Osztálydefiníció (Bevezetés)

OOP és UML Áttekintés

Bánsághi Anna

Java VII. Polimorfizmus a Java nyelvben

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Virtuális függvények (late binding)

Osztályok. construct () destruct() $b=new Book(); $b=null; unset ($b); book.php: <?php class Book { private $isbn; public $title;

Objektum Orientált Programozás. 5. JAVA osztályok 21/1B IT MAN

Java és web programozás

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

Java és web programozás

OOP: Java 6.Gy: Java osztályok. Definíció, static, túlterhelés

Java Programozás 5. Ea: OOP alapok. Abstract Javaságok

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

BME MOGI Gépészeti informatika 8.

Segédanyag: Java alkalmazások gyakorlat

Objektumorientált programozás C# nyelven III.

Programozás II. labor

Java VII. Polimorfizmus a Java nyelvben

Szoftvertechnológia alapjai Java előadások

Java programozási nyelv

C++ programozási nyelv

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Visual C++ osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés.

OOP #14 (referencia-elv)

Származtatási mechanizmus a C++ nyelvben

Már megismert fogalmak áttekintése

Programozási nyelvek Java

OOP: Java 5.Gy: Osztály, referencia, konstruktor

OOP. Alapelvek Elek Tibor

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

Java II. I A Java programozási nyelv alapelemei

4. Gy: JAVA osztályok

Java Programozás 11. Ea: MVC modell

Programozási alapismeretek 4.

Mi a különbség az extends és az implements között. Mikor melyiket kell használni? Comperable-t megvalósító oasztályokban össze lehet hasonlitani

BME MOGI Gépészeti informatika 4.

Programozás I. Első ZH segédlet

OOP: Java 7.Gy: Öröklődés, referenciák

Programozás. C++ osztályok. Fodor Attila. Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék

3. Osztályok II. Programozás II

Java II. I A Java programozási nyelv alapelemei

Programozás I. 1. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Vé V g é r g e r h e a h j a tá t s á i s s z s ál á ak a Runnable, Thread

Programozási technológia

Programozás I. 5. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Programozási nyelvek JAVA EA+GY 1. gyakolat

Átírás:

Java IX. Kivétel telkezelés a Java-ban Krizsán Zoltán Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2005. 11. 17. Java IX. Kivételkezelés JAVA9 / 1 A kivételkezel telkezelés célja Kivételes helyzetek (hibák) a jól megírt programokban is előfordulnak. Például: erőforrás hiány (lemez megtelt) valamilyen funkció hiányos vagy hibás adatok miatt nem hajtható végre. Ezeket a szituációkat kezelni kell. A szükséges teendők elvégzése után általában a program folytatni tudja a munkát. Java IX. Kivételkezelés JAVA9 / 2 Hagyományos hibakezelés Függvény visszatérési értéke (paramétere) hátrányai: azonosítás hibaérték / valódi érték megkülönböztetése nehézkes hívási hierarchia! Java: hibastátusz adattag és visszaadó függvény Ellenőrzés nehézkes, sok helyre kell beiktatni. Kód áttekinthetőségét rontja! A funkcionális és a hibakezelő kódrészletek keverednek. Java IX. Kivételkezelés JAVA9 / 3

Kivétel - exception Futás idejű hiba / nem normális eset Általában valamilyen hibához kötődik. Számos beépített kivétel. Saját kivétel definiálható. A Java szemléletében a kivétel egy objektum, ami a kivétel bekövetkezésekor jön létre. Saját (programozói) kivétel kiváltása: throw objektum Java IX. Kivételkezelés JAVA9 / 4 Kivétel - hiba A kivétel keletkezésekor szokásos teendők : értesíteni a felhasználót, vagy naplózni, majd valamilyen plusz műveletek után folytatni az alkalmazást, esetleg kilépni, súlyos hiba esetén. Ellenőrzött kilépés lehetséges. (Például előtte minden értékes adat elmenthető.) A kivétel objektum tartalmazhat információkat a kivétel keletkezéséről, amelyet felhasználhatunk. Java IX. Kivételkezelés JAVA9 / 5 Kivételkezelés utasításai try védett kód (blokk) kijelölése throw kivétel dobása, generálása catch kivétel elkapása, a blokkban definiált utasítások végrehajtása finally végül, akár volt kivétel, akár nem volt, lefut Java IX. Kivételkezelés JAVA9 / 6

Try blokk A védett kódot try blokkban helyezzük el try { utasítások A blokkban keletkezett kivételt mi kezelhetjük le. A blokkok egymásba ágyazhatóak. Érdemes minél kisebb blokkokat definiálni. Kivétel keletkezik, ha a try blokkban egy throw utasításra fut a vezérlés. Formája: throw new kivételtípus(konstruktor paraméterek) A throw paramétere nem maradhat el! Java IX. Kivételkezelés JAVA9 / 7 Kivétel keletkezése Kivétel keletkezhet az alábbi módokon: Implicit módon: a JAVA rendszerből indul ki, azaz valamely utasítás vagy API elem végrehajtása során keletkezik. A programozó kódjában keletkezik, közvetlenül egy throw utasítás végrehajtásával. Aszinkron kivétel, amely a program egy másik szálán lépett fel. Java IX. Kivételkezelés JAVA9 / 8 Kivétel keletkezése (folyt.) A kivétel keletkezése esetén: Az első kivételt kiváltó utasítással befejeződik a try blokk végrehajtása. Kilép a blokkból a vezérlés, rendcsinálással verem visszaállítása, lokális objektumok megszüntetése, védett változók lezárásának megszüntetése. Létrejön a throw utasításban megjelölt objektum egy példánya. Java IX. Kivételkezelés JAVA9 / 9

A kivétel elkapása A kivétel objektumot minden esetben a virtuális gép hozza létre. A kivétel lekezelését szolgáló utasítások catch blok(kok)ban helyezkednek el. Formája: catch (típus paraméter) {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. Java IX. Kivételkezelés JAVA9 / 10 A kivétel elkapása (folyt.) A virtuális gép megkeresi a sorrendben első "illeszkedő" blokkot, és annak végrehajtásával folytatódik a program. Az illeszkedés feltétele: a kivétel objektum típusa megegyezik a catch blokk fejében megadott típussal, vagy annak leszármazottja. A kiválasztott blokk végrehajtása során a paramétere úgy használható, mint a függvények esetén a formális paraméter. Így lehet felhasználni a kivétel objektumban tárolt információkat. Java IX. Kivételkezelés JAVA9 / 11 A kivétel elkapása (folyt.) A futás az utolsó catch utáni sorral folytatódik. Minden ellenőrzött kivételt kezelni kell (fordítási hiba, ha van lekezeletlen kivétel)! Ha ha a catch blokk végrehajtása során újabb kivétel keletkezik, az eredeti kivétel kezelése megszakad, és az új kivétel lekezelése kezdődik el. Java IX. Kivételkezelés JAVA9 / 12

A kivétel elkapása (folyt.) Ha egyetlen catch blokk sem illeszkedett a kivételre, a keresés a beágyazó try blokk catch blokkjaival folytatódik, amíg sikeres nem lesz. Ha a keresés belülről kifelé minden try blokkot megvizsgált, és nem talált egyezést, a program terminálódik, és kiíródik a kivétel stack. (Lekezeletlen kivétel.) Megjegyzés: a try blokk kivételt kiváltó utasítása utáni utasítások tehát mindig kimaradnak! Java IX. Kivételkezelés JAVA9 / 13 A finally blokk Nem kötelező. A cacth(ek) után szerepelhet. Az utolsó catch blokk és a finally blokk között nem lehet más utasítás. Nem lehet paramétere. 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. Alkalmas például fájlok, adatbázis kapcsolatok lezárására. Java IX. Kivételkezelés JAVA9 / 14 Egymásba ágyazott try blokkok A try blokkok egymásba ágyazhatók közvetlenül, vagy közvetve, amikor a try blokkban egy olyan metódus hívása szerepel, amely tartalmaz try blokkot. Úgy tekinthetjük, hogy a main metódus egy implicit try blokkban fut, és itt kezelődik le minden olyan kivétel, amelyet egyetlen catch blokk sem kapott el előtte. Java IX. Kivételkezelés JAVA9 / 15

Példa: a vezérlés menete Kivétel nélkül: try { // utasítások throw new... // további utasítások catch (T1 p1) { catch (T1 p1) { catch (T1 p1) { // további utasítások Kivétellel: try { // utasítások throw new... // további utasítások catch (T1 p1) { catch (T1 p1) { catch (T1 p1) { // további utasítások Java IX. Kivételkezelés JAVA9 / 16 Kivétel objektum Mivel objektum, valamely definiált osztály példánya kell legyen (kivétel osztály). Minden kivétel osztály a Java.lang.Throwable osztály leszármazottja kell legyen, de ez általában közvetve valósul meg. A Java.lang.Throwable osztálynak van számos előre definiált (a Java API részét képező) leszármazottja. Java IX. Kivételkezelés JAVA9 / 17 Kivétel osztályok Java IX. Kivételkezelés JAVA9 / 18

Kivétel osztályok (folyt.) AzError és a RuntimeException osztályú kivételek nem ellenőrzött kivételek. Az összes többi ellenőrzött kivétel. Ajánlott: minden programozó által definiált kivétel az Exception osztályból származzon. Valamennyi ilyen kivétel ellenőrzött kivétel, kötelező lekezelni. Konvenció: minden kivételosztály neve ValamiException legyen, ahol a Valami a kivétel jellegére utal. Java IX. Kivételkezelés JAVA9 / 19 Nem ellenőrzött kivételek Az Error és a RuntimeException osztályból származó kivételek Error: rendszerszintű hiba a JVM működésében. (Pl. OutOfMemoryError) RuntimeException: a program számos pontján keletkezhetnek, ezért nem célszerű kötelezővé tenni a lekezelésüket. (Pl. ArrayIndexOutOfBounds). A programozó, ha akarja, lekezelheti. Lekezeletlen kivétel esetén a program terminálódik, és kiíródik a kivétel stack. Java IX. Kivételkezelés JAVA9 / 20 Ellenőrzött kivételek A fordítóprogram hibát jelez, ha nincs lekezelve! A kivétel lekezelésének módjai: Atry blokk utáni valamelyik catch blokk elkapja, és teljes mértékben lekezeli. A metódus futása folytatódik a catch blokkok utáni első utasítással. Atry blokk utáni valamelyik catch blokk elkapja, és részben lekezeli. A lekezelés egy olyan throw utasítással fejeződik be, amely a paraméterül kapott kivétel objektumot tartalmazza. A metódus futása befejeződik. A metódus fejlécében ezt a kivételt specifikálni kell. Java IX. Kivételkezelés JAVA9 / 21

Ellenőrzött kivételek (folyt.) A metódus nem kezeli le a kivételt, de specifikálja azt a fejlécében. A metódus futása befejeződik. Ez akkor szükséges, amikor az adott metódus nem, csak a hívó tudja értelmesen lekezelni a kivételt. A hívó is tovább adhatja a kivétel lekezelését, így a kivétel tetszőleges hívási mélységből is eljuthat oda, ahol lekezelhető. Java IX. Kivételkezelés JAVA9 / 22 Kivételek specifikálása Ha egy metóduson belül kivétel keletkezhet, de nem tartalmaz catch utasításokat annak kezelésére. Ilyenkor a metódus hívójának kell azokat lekezelni. Erre számítania kell, ezért az ilyen kivételeket a metódus fejlécében specifikálni kell. Formája: metódusnév([parameterlista]) [throws kivetelosztály1 [, kivételosztály2, ] ] Java IX. Kivételkezelés JAVA9 / 23 Az Exception osztály Van egy String paraméterű konstruktora, amellyel egy leírás definiálható a kivételhez. Számos hasznos metódust definiál, amely örökölődik, és szükség esetén felüldefiniálható. String tostring(): visszaad egy sztringet, amely az osztály azonosítójából és a konstruktorban megadott sztringből áll String getmessage(): visszaadja a konstruktorban megadott sztringet. Java IX. Kivételkezelés JAVA9 / 24

Az Exception osztály (folyt.) printstack(): kiírja a keletkezett kivételeket, a keletkezésük sorrendjében és megadja a keletkezésük helyét. Hasznos lehet a hibakereséshez. Paraméter nélkül a standard hibacsatornára ír, de paraméterben megadható, hogy hová írjon. Java IX. Kivételkezelés JAVA9 / 25 Saját kivétel osztály Ajánlások: AzException 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 további paraméterek a hibára jellemző adatokat fogadhatnak. A metódusai a catch blokkban használhatók a kivétel lekezelése során. Java IX. Kivételkezelés JAVA9 / 26 Saját kivétel osztály (folyt.) A kivételek csoportosítására célszerű leszármazási hierarciát létrehozni a saját kivételosztályok között is. Java IX. Kivételkezelés JAVA9 / 27

Egyszerű példa Saját kivétel osztály: package kivetel2; public class PeldaException extends Exception { public PeldaException(String a) { super(a); Java IX. Kivételkezelés JAVA9 / 28 Egyszerű példa (folyt.) Kivételt kiváltó kód: package kivetel2; public class proba2 { public static void main(string[] args) { try { throw new PeldaException("Leiras"); Java IX. Kivételkezelés JAVA9 / 29 Egyszerű példa (folyt.) Kivételt lekezelő kód: catch (PeldaException e){ System.out.println(e); // e.tostring() System.out.println(e.getMessage()); e.printstacktrace(system.out); finally { System.out.println("Kész"); // main vége // class proba2 vege Java IX. Kivételkezelés JAVA9 / 30

Egyszerű példa (folyt.) Az output: // e.tostring() eredménye: kivetel2.peldaexception: Leiras // e.getmessage eredménye: Leiras // printstack eredménye: kivetel2.peldaexception: Leiras at kivetel2.proba2.main(proba2.java:9) // finally blokk Kész Java IX. Kivételkezelés JAVA9 / 31 További példa Háromszög osztály. A konstruktornak vizsgálnia kell, hogy a kapott oldalhosszakból képezhető-e háromszög. Ha nem, azt két módon jelezheti (nincs visszatérési érték!): hiba státusz adattag (nem elegáns megoldás) kivételt dob. A keletkezett kivételt nem tudja értelmesen lekezelni, tehát specifikálnia kell a hívó részére. Java IX. Kivételkezelés JAVA9 / 32 Saját kivétel osztályok: Exception HaromszogException NegativOldalHosszException NemHaromszogException Java IX. Kivételkezelés JAVA9 / 33

Az osztályok felüldefiniálják a tostring metódust. Ezért mindhárom kivétel kiírható a System.out.println() metódussal. A kiíráshoz a megfelelő metódust a dinamikus típus alapján kell megkeresni (késői kötés). A példa a kivételkezelésen kívül néhány korábbi nyelvi szerkezetet is szemléltet. Java IX. Kivételkezelés JAVA9 / 34 A kivételek jelentése: NegativOldalHosszException: legalább egy oldalhossz nem pozitív. NemHaromszogException: az oldalhosszak pozitívok, de a háromszög egyenlőtlenség nem teljesül. HaromszogException: valami miatt nem képezhető háromszög az adatokból. A közös ős hasznos lehet a kivételek összefoglaló típusaként is. Java IX. Kivételkezelés JAVA9 / 35 package kivetel3; public class HaromszogException extends Exception { // Az adatok tarolasara protected double a; protected double b; protected double c; Java IX. Kivételkezelés JAVA9 / 36

// Konstruktor public HaromszogException(double a, double b, double c) { super("nem haromszög!"); this.a = a; // Eltárolja a hibás this.b = b; // adatokat this.c = c; public String tostring() { return "Nem alkot haromszöget: " + a + b + c; // class vege Java IX. Kivételkezelés JAVA9 / 37 Megjegyzés: A konstruktor (vagy valamely metódus) formális paraméterének azonosítója egyezhet egy adattagéval. A this pszeudó változó használatával a kettő megkülönböztethető. A konstruktor paraméterének és a hozzá tartozó adattagnak az egyezése egy szokásos kódolási konvenció. Java IX. Kivételkezelés JAVA9 / 38 package kivetel3; public class NegativOldalHosszException extends HaromszogException { public NegativOldalHosszException(double a, double b, double c) { super(a, b, c); public String tostring() { return "Legalább egy negatív oldal: " + a + b + c; Java IX. Kivételkezelés JAVA9 / 39

Megjegyzés: Az a, b, c adattagokra vonatkozó hivatkozás helyes, annak ellenére, hogy nincsenek az osztálynak ilyen nevű adattagjai. Az ősosztálytól örökli. Mivel a minősítésük protected, közvetlenül el is érheti. Java IX. Kivételkezelés JAVA9 / 40 package kivetel3; public class NemHaromszogException extends HaromszogException { public NemHaromszogException(double a, double b, double c) { super(a, b, c); public String tostring() { return "Nem teljesül a háromszög egyenlőtlenség: " + a + b + c; Java IX. Kivételkezelés JAVA9 / 41 És akkor a Haromszog osztály: package kivetel3; public class Haromszog { private double a; private double b; private double c; Java IX. Kivételkezelés JAVA9 / 42

// Konstruktor public Haromszog(double a, double b, double c) throws HaromszogException { try { if (a <= 0 b <= 0 c <= 0){ throw new NegativOldalHosszException(a, b, c); Java IX. Kivételkezelés JAVA9 / 43 if (((a + b) > c) && ((b + c) > a) && ((c + a) > b)) { // objektum OK! this.a = a; // Inicializálás this.b = b; this.c = c; else { throw new NemHaromszogException(a, b, c); // try blokk vége Java IX. Kivételkezelés JAVA9 / 44 Megjegyzés: A try blokkban csak a két leszármazott típusú kivétel keletkezhet, de a konstruktornak elég a közös őst specifikálnia. Java IX. Kivételkezelés JAVA9 / 45

catch (HaromszogException h) { throw h; // kivétel tovább dobása // konstruktor vége public double kerulet() { // Metódus return a + b + c; // class Haromszog vege Java IX. Kivételkezelés JAVA9 / 46 Megjegyzés: Csak egy catch blokk van, amelyben az ős osztály típusa szerepel. Ez a blokk mindkét kivételre illeszkedik. A catch blokk nem tudja lekezelni a kivételt, ezért tovább dobja. Kivétel keletkezése esetén az adattagok explicite nem inicializálódnak. Alapértelmezés szerint 0 lesz az értékük. Java IX. Kivételkezelés JAVA9 / 47 package kivetel3; public class proba { public static void main(string[] args) { try { Haromszog h = new Haromszog (4., 5., 6.); System.out.println ("Kerület:" + h.kerulet()); catch (HaromszogException e) { System.out.println(e); Java IX. Kivételkezelés JAVA9 / 48

Megjegyzés: Nem keletkezik kivétel. Az output: Kerület:15.0 A catch blokk mindkét kivételt elkapná, de most kimarad a végrehajtásból. Java IX. Kivételkezelés JAVA9 / 49 try { Haromszog h=new Haromszog (4.,-5., 6.); System.out.println ("Kerület:" + h.kerulet()); catch(negativoldalhosszexception e) { System.out.println(e); catch (HaromszogException e) { System.out.println(e); Java IX. Kivételkezelés JAVA9 / 50 Megjegyzés: Kivétel keletkezik. A try blokk további részei (a kerület számítása és kiírása) elmarad. A kivételt az első catch blokk kapja el. Az output: Legalább egy negatív oldal: 4.0-5.06.0 A második catch blokk kimarad. Java IX. Kivételkezelés JAVA9 / 51

try { Haromszog h = new Haromszog (4., 5., 60.); System.out.println ("Kerület: " + h.kerulet()); catch (NegativOldalHosszException e) { System.out.println(e); catch (NemHaromszogException e) { System.out.println(e); catch (HaromszogException e) { System.out.println(e); Java IX. Kivételkezelés JAVA9 / 52 Megjegyzés: Kivétel keletkezik, amelyet a második catch blokk kap el. Az output: Nem teljesül a haromszög egyenlőtlenség: 4.05.060.0 Az első és a harmadik catch blokk kimarad. Java IX. Kivételkezelés JAVA9 / 53 try { Haromszog h = new Haromszog (4., 5., 60.); System.out.println ("Kerület: " + h.kerulet()); catch (HaromszogException e) { System.out.println(e); Java IX. Kivételkezelés JAVA9 / 54

Megjegyzés: Most is NemHaromszogException kivétel keletkezik, amelyet a catch blokk elkap, mert leszármazottja a HaromszogException kivételnek. Az output: Nem teljesül a haromszög egyenlőtlenség: 4.05.060.0 Java IX. Kivételkezelés JAVA9 / 55 A kiírás a tényleges hibának megfelelő, annak ellenére, hogy HaromszogException típusú kivételt írunk ki. Magyarázat: a tostring metódusok felül definiáltak, így hívásukat nem a statikus, hanem a dinamikus típus határozza meg. Java IX. Kivételkezelés JAVA9 / 56