Kivtelkezels Kivtel fogalma Kivtelnek nevezzk a program abnormlis
Kivételkezelés
Kivétel fogalma Kivételnek nevezzük a program abnormális működése során megjelenő (kivételes) eseményeket. Például: • Nem létező fájl megnyitása • Nullával való osztás • Négyzetgyökvonás negatív számból • Rossz felhasználói akció • Saját kivétel
Saját kivétel • Egyszerűsíti a munkát • A hasonló kivételeket egy helyen tudjuk lekezelni • Szimulálni tudunk „szabványos” kivételeket • Pl: az életkor nem lehet negatív és több, mint 150 (sajnos. . )
Kivétel kezelése • Amennyiben kivételek keletkeznek, a programozó feladata, hogy kezelje őket. Nem muszáj, de erősen ajánlott. • A dobott kivételt el kell kapni. • Throw és catch. • A kezelés azt jelenti, hogy mentjük a menthetőt és tovább folytatjuk a programot. • PL nem létező fájl nyitása esetén kiírjuk, hogy nincs ilyen állomány, s újra bekérjük az állomány nevét, vagy nyitunk egy default-ot.
Kivétel kezelésének folyamata • Kivételt dob valamelyik (hiba lehetőséget tartalmazó) programrész. • Elkapjuk a kivételt még mielőtt felszállna a main fölé. • Lehetőleg az elkapás keretében le is kezeljük a kivételt. (Az elkapott, de le nem kezelt kivétel esetén a kivételt okozó programrész nem kerül végrehajtásra. )
Kezeletlen kivétel public class Main { public static void kivetel(){ int a=2/0; } public static void main(String[] args) { kivetel(); } }
Kezeletlen kivétel Az eredmény: Exception in thread "main" java. lang. Arithmetic. Exception: / by zero at kivétel. Main. kivetel(Main. java: 14) at kivétel. Main. main(Main. java: 20)
Kezelt kivétel public class Main { public static void kivetel(){ try{ int a=2/0; } catch(Throwable e){ } } public static void main(String[] args) { kivetel(); } }
Az eredmény init: deps-jar: Compiling 1 source file to C: javaprogKivételbuildclasses compile: run: BUILD SUCCESSFUL (total time: 0 seconds) Azaz semmi….
Jobban kezelt kivétel public class Main { public static void kivetel(){ try{ int a=2/0; } catch(Throwable e){ System. out. println("Kivetel dobodott. . . "); } } public static void main(String[] args) { kivetel(); } }
Eredmény init: deps-jar: Compiling 1 source file to C: javaprogKivételbuildclasses compile: run: Kivetel dobodott. . . BUILD SUCCESSFUL (total time: 0 seconds)
Kivételek a Java-ban • A kivételeket Java-ban osztályok reprezentálják • A kivételek a Throwable ősosztály leszármazottjai • Vannak előredefiniált –már létezőkivételek • Saját kivétel esetén tehát vagy a Thorwable osztályból, vagy a Throwable osztályból származó osztályból származtatunk
Saját kivétel dobása public class Main { public static void kivetel(){ try{ int a=-1; if (a<0) throw new Thorwable(); } catch(Throwable e){ System. out. println("Kivetel dobodott. . . "); } } public static void main(String[] args) { kivetel(); } } Eredmény: Kivetel dobodott. . .
Kivétel osztályok Ellenőrzött Throwable Exception Runtime. Exception Error Ellenőrzetlen
Egy try-hoz több catch public class Main { public static void kivetel(){ try{ int a=-1; if (a<0) throw new Error(); } catch(Error e){ System. out. println("1"); } catch(Throwable e){ System. out. println("2"); } } public static void main(String[] args) { kivetel(); } } Eredmény: 1
Egy try-hoz több catch public class Main { public static void kivetel(){ try{ int a=-1; if (a<0) throw new Error(); } } catch(Throwable e){ System. out. println("2"); } } catch(Error e){ System. out. println("1"); } } } public static void main(String[] args) { kivetel(); }} Eredmény: fordítási hiba exception java. lang. Error has already been caught
Kivételek osztályozása • Ellenőrzött kivételek (checked exceptions) – Kezelésük kötelező – Az Exceptionból származnak (állomány kezelés) • Nem ellenőrzött kivételek (unchecked exc. ) – Kezelésük nem kötelező – Az Error-ból, vagy a Runtime. Exception-ból származnak (matematika)
Ellenőrzött kivételek A kivételt vagy a keletkezés helyén kell lekezelni, vagy a lekezelés kényszerét tovább kell dobni a hívó eljáráshoz. Jelzése: throws kivételosztály Legkésőbb a main-ben kezelhető le
Ellenőrizetlen kivételek Ha az adott metóduson belül nincs catch, akkor a hívó metódusban keres a JVM egy catch blokkot. Ha a hívó metódusokhoz történő visszalépések során egészen a main metódusig nem találunk megfelelő catch blokkot, akkor hiba, és kilép a programból. (Hibaüzenettel)
Ellenőrzött kivétel public class Main { public static void kivetel() throws Throwable{ } public static void main(String[] args) { kivetel(); } } Eredmény: unreported exception java. lang. Throwable; must be caught or declared to be thrown kivetel(); 1 error
Ellenőrzött kivétel public class Main { public static void kivetel()throws Throwable{ } public static void main(String[] args) { try{ kivetel(); } catch(Throwable t){}; } } Eredmény: semmi gond
Ellenőrizetlen kivétel public class Main { public static void kivetel() throws Error{ } public static void main(String[] args) { kivetel(); } } Eredmény: Semmi gond
Saját kivételosztály írása class Kivétel extends Error{ } public class Main { public static void kivetel()throws Kivétel{ } public static void main(String[] args) { kivetel(); } }
Saját kivételosztály írása class Kivétel extends Error{ } public class Main { public static void kivetel(){ throw new Kivétel(); } public static void main(String[] args) { try{kivetel(); } catch(Kivétel k){ System. out. println(k. get. Message()); } } } Eredmény: null
Saját kivételosztály írása class Kivétel extends Error{ public Kivétel(String s){ super(s); }; } public class Main { public static void kivetel(){ throw new Kivétel("hopp"); } public static void main(String[] args) { try{kivetel(); } catch(Kivétel k){ System. out. println(k. get. Message()); } } } Eredmény: hopp
Tehát…. . • Kivételt a throw kulcsszóval dobunk • throw kivételobjektum • A kivételobjektum a Throwable osztály leszármazott osztályából van példányosítva • A metódus fej után meg lehet adni, hogy milyen kivételt fog dobni a metódus, csak ellenőrzött kivételek esetén muszáj kezelni
Kivételek elkapása try-catch[-finally] Azaz: try{ Problémás rész} catch (Kivételosztály kivételobjektum){ esetleges hiba kezelése} [ finally{ amit mindenképpen végre kell hajtani} ]
try esetén kell vagy catch, vagy finally class Kivétel extends Error{ } public class Main { public static void kivetel(){ } public static void main(String[] args) { try{kivetel(); } } } Eredmény: 'try' without 'catch' or 'finally' try{kivetel(); }
try esetén kell vagy catch, vagy finally class Kivétel extends Error{ } public class Main { public static void kivetel(){ } public static void main(String[] args) { try{kivetel(); } finally{}; } } Eredmény: semmi gond
try esetén kell vagy catch, vagy finally class Kivétel extends Error{ } public class Main { public static void kivetel(){ } public static void main(String[] args) { try{kivetel(); } catch(Kivétel k){}; } } Eredmény: semmi gond
- Slides: 30