300 likes | 388 Views
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.
E N D
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.ArithmeticException: / 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:\javaprog\Kivétel\build\classes 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:\javaprog\Kivétel\build\classes 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 Error Exception RuntimeException 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 RuntimeException-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.getMessage()); } } } 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.getMessage()); } } } 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