Kivetelek öa program vegrehajtasa soran ritkan beko vetkez esemenyek önem a f vegrehajtasi agű; logikailag alacsonyabbrendu feladat jelzese öhiba öfelhasznalí butasagot csinal öspecialis/abnormalis szamıtasi eredmeny Hibak ömas nyelvekben elkepzelhet, hogy egy hiba fejreallıtja a programot ú Jí esetben csak elszall ú Esetleg nagy butasagot csinal, pl. elrontja az adatbazist öjava-ban a futtatí rendszer ellen rzi a hiba kat Milyen hibak vannak? önullaval valí osztas öto mb tülindexeles öhivatkoza s nullű mutatín keresztél öe rtek tül/alulcsordula s önincs meg egy fajl öhalízati kapcsolat megszakad Kivetel!= Hiba öa kivetelek nem mindig hibat jeleznek ölehet, hogy csak egy ritkan beko vetkez, vagy a feladat szempontjabíl kevesbe fontos esemenyt Kivetel kezelese öegy jíl megırt, megbızhatí program jelent s resze a kiveteles esemenyekkel foglalkozik öjí, ha van programnyelvi tamogatas erre 1
Ha nincs kivetelkezelesre tamogatas öpl. C-ben, Pascal-ban nincs specialis eszko z a kivetelek kezelesere ömegoldas: visszateresi hibakídok, plussz parameterek, esetvizsgalatok (elagazasok) öá vagy egyszeru en semmi Á ú lustasag ú olvashatísa g, elegancia Kivetelkezelest tamogatí nyelvi elemek ökis er feszıtessel, az olvashatísagot es az eleganciat megtartva lehessen kiveteleket kezelni öa ltalaban a kiveteleket kezel kídot elvalasztjak a to bbit l, a lenyegt lű öaz elkeszélt programok megbızhatísagat, olvashatísa ga t no velik Tartalom ökivetelek fellepese ökivetelek terjedese ökivetelek lekezelese ökivetelek tovabbterjedesenek specifikalasa ökivetelek definialasa ökivetelek kivaltasa ökélo nbo z kivetelfajta k Kivetel fellepese öa program egy pontjan, egy utasıtas vegrehajta sa ko zben öjelezhet hibat, vagy specialis esemenyt önullpointerexception, ArrayIndexOutOfBoundsException ClassCastException IOException int[] t; t[0] = 12; // fordıtasi hiba t = new int[3]; t[3] = 21; 2
int[] t = null; t[0] = 12; // NullPointerException t = new int[3]; t[3] = 21; int[] t; // t[0] = 12; t = new int[3]; t[3] = 21; // ArrayIndexOutOfBoundsE. Kivetelek terjedese öa hıvasi lanc menten ú A vegrehajtasi verem menten öha egy m metídusban kivetel lep fel, akkor az azt meghıví metídusban is fellep, azon a ponton, ahol meghıvtuk az m metídust ú hacsak persze le nem kezeljéká öegeszen addig, amıg a main-ben is fel nem lep: ekkor leall a program, es kiırja a kivetelt ú stack trace m1(3); m1(80); static void m1( int i ) { int[] t = new int[i]; m2(t); static void m2( int[] t ){ t[7] = 12; A "stack trace" $ java A Exception in thread "main" java.lang.arrayindexoutofboundsexception at A.m2(A.java:10) at A.m1(A.java:8) at A.main(A.java:3) örengeteg hasznos informacií ú Melyik vegrehajtasi szal ú Milyen kivetel (hiba) lepett fel ú Melyik fajlban, melyik sorban, melyik metídusban ú Milyen hıvasi lanc menten terjedt 3
Feladat övaltsunk ki egy hibat: osszunk le egy egesz sza mot nulla val öel szo r a f programban öpríbaljuk ki egy, a f programbíl meghıvott metídusban öaz osztandí es az osztí legyen parancssori argumentum Kivetel lekezelese öa kivetel terjedese ko zben egy ponton a hıvasi lancon lekezelhetjék öegy specialis vezerlesi szerkezet: try catch finally m1(3); m1(80); static void m1( int i ) { int[] t = new int[i]; m2(t); catch (Exception e){ static void m2( int[] t ){ t[7] = 12; m1(3); m1(80); static void m1( int i ) { int[] t = new int[i]; m2(t); catch (Exception e){ static void m2( int[] t ){ t[7] = 12; m1(3); m1(80); static void m1( int i ) { int[] t = new int[i]; m2(t); catch (Exception e){ static void m2( int[] t ){ t[7] = 12; 4
Hogyan kezeljénk le egy kivetelt övalami ertelmes dolgot csinaljunk static void m1( int i ) { int[] t = new int[i]; m2(t); catch (Exception e){ System.out.println(e); öpríbaljuk folytatni a mu ko dest a kivetel (pl. hiba) ellenere öharıtsuk el a hibat, es príbalkozzunk üjra ömentsék, ami menthet ú Zarjuk le a fajlokat, adatbazist A hiba kiırasa ösok programozí kiıratja, hogy hiba to rtent, es kilep a programbíl öertelmetlen mídja a hiba lekezelesenekű öamügy is kiırta volna a virtualis gep try - catch övedett blokk: try ökivetelkezel agak: catch öegy vedett blokkhoz to bb kivetelkezel ag ú KÉlo nbo z kivetelekhezá öa kivetel fajtajatíl fégg, melyik kivetelkezel ag aktivizalídik catch (NullPointerException e){ catch (IOException e){ catch (InterruptedException e){ 5
catch (NullPointerException e){ catch (IOException e){ catch (InterruptedException e){ A kivetelkezel keresese öha a try blokkban kivetel lep fel, akkor a hozza tartozí catch agakban keres a JVM kivetelkezel t ösorba nezi a catch agakat, az els megfelel to rzset vegrehajtja ömegfelel : ha a kivetel fajtaja beletartozik a specifika lt kiveteloszta lyba IOException felle p catch (NullPointerException e){ catch (IOException e){ catch (InterruptedException e){ Feladat öaz el bbi feladat folytatasa: kezeljék le a kivetelt az osztast vegz metídusban. A kivetelek is objektumok öa kivetel fajtaja - az objektum osztalya öa kivetelek hierarchiaba vannak szervezve: az oszta lyhierarchia a ltal öbeletartozik egy kategíriaba: altıpusossag 6
EOFException felle p catch (NullPointerException e){ catch (IOException e){ catch (InterruptedException e){ Ha nincs megfelel catch ag öha nem talalunk megfelel kivetelkezel t, akkor a kivetel tovabbterjed ú Mintha nem is lett volna kivetelkezel resz öa hıvíban üjbíl lehet segénk van a kivetel lekezelesere IndexOutOfBoundsException felle p catch (NullPointerException e){ catch (IOException e){ catch (InterruptedException e){ Hol kezeljék le a kivetelt öott, ahol ez ertelmesen megtehet ú ne el bb ú ne kes bb öha nem tehet meg ertelmesen, inkabb engedjék, hogy a program elszalljon Feladat öaz el z feladat folytatasa: a metídus legyen féggveny, ami visszaadja az osztas eredmenyet. A f program kezeli le a kivetelt. Irja ki, hogy az osztas eredmenye pozitıv vagy negatıv vegtelen, vagy esetleg definialatlan. (0/0) 7
Ha sikerél lekezelni a kivetelt öa futas a kivetelkezel resz utan folytatídik ú Nem megy visszaű a try-ba, ahol fellepett <ut 1> <ut 2> <ut 3> <ut 4> catch ( <exc 1> ) { <ut 5> <ut 6> <ut 7> catch ( <exc 2> ) { <ut 8> <ut 9> catch ( <exc 3> ) { <ut 10> <ut 11> Ha nem sikerél lekezelni a kivetelt öa kivetel a hıvas helyen fellep ú Az adott metídus vegrehajtasa megszakad <ut 1> <ut 2> <ut 3> <ut 4> catch ( <exc 1> ) { <ut 5> <ut 6> <ut 7> catch ( <exc 2> ) { <ut 8> <ut 9> catch ( <exc 3> ) { <ut 10> <ut 11> A kivetelkezel agak sorrendje öa szu kebb meg kell, hogy el zze a b vebbet catch( EOFException e1 ){ catch( IOException e2 ){ öez ıgy jí. A kivetelkezel agak sorrendje öa szu kebb meg kell, hogy el zze a b vebbet catch( IOException e1 ){ catch( EOFException e2 ){ finally öa try blokk es a catch agak utan ırhatí egy finally blokk öazokat az utasıtasokat tartalmazza, amelyeket mindenfe leke ppen vegre kell hajtani. öez nem jí. Fordıtasi hiba. ú A masodik sohasem valasztídhat ki. 8
catch( ){ catch( ){ finally { catch( ){ catch( ){ finally { finally: mindenkeppen öha nem lepett fel kivetel öha fellepett, de nem talalunk megfelel kivetelkezel agat öha talalunk: akkor utana Tova bbterjedes specifika la sa öha egy kivetel fellep egy metídusban, akkor: vagy le kell kezelni vagy jelezni kell, hogy tovabbadhatjuk öa metídusok specifikaciíja tartalmazza a metídusban fellep lehetseges kiveteleket öa parameterlista es a to rzs ko zo tt öthrows utasıtas InputStream in = new FileInputStream("input.txt"); catch (IOException e) { 9
public static void main(string args[]) throws IOException { InputStream in = new FileInputStream("input.txt"); Szabalyozott terjedes öha egy mu velet kivalthat egy kivetelt, akkor a mu velet hasznalíja tudni fog ríla öpl. lekezelheti öha nem, neki is specifikalnia kell, ıgy az t hasznalí is tudomast szerez a kivetelr l öa kivetel olyan, mint egy specialis visszateresi ertek RuntimeException övannak olyan kivetelek, amelyeket nem kell lekezelni vagy a tovabbterjedeset specifika lni ötül sok helyen fellephetnek ú Lenyegeben a program minden pontjan öelbonyolıtana a programot, ha öa ltalaban programozíi hibat jelentenek, nem kiveteles esemenytű Mik ezek önullpointerexception ú Barmelyik objektumhivatkozasnal öarrayindexoutofboundsexception ú Barmelyik to mbindexelesnel öarithmeticexception ú Barmelyik egesz osztaskor östb. Programozíi hibak öa programozí altalaban ügy ırja meg a programjat, hogy vigyaz arra, hogy ne legyenek programozíi hibak ösokszor felesleges hibakezelest betenni, vagy specifikalni a tovabbterjedest öpersze megengedett mind a lekezeles, mind a tovabbterjedes specifikaciíja 10
A kivetelosztalyok hierarchiaja Throwable Az Error leszarmazottjai Error InternalError stb RuntimeException Exception IOException SajatException stb öfatalis hibak: mar nincs mit tenni önem ko telez lekezelni vagy a terjedest specifika lni ö ul: ú OutOfMemoryError ClassFormatError InstantiationError LinkageError NoClassDefFoundError VirtualMachineError StackOverflowError NullPointerException stb EOFException stb A RuntimeException lesza rmazottai öaz el bb mar beszelténk ríluk öprogramozíi hibat jeleznek önullpointerexception ArrayIndexOufOfBoundsException ArithmeticException Az Exception egyeb lesza rmazottai öezekb l van a legto bb ökiveteles esemeny övagy lekezeljék, vagy specifikaljuk a terjedeséket ö ul ú IOException, FileNotFoundException, InterruptedException, SQLException Saja t kiveteloszta lyok ösajat kiveteles esemenyek jelzese önagy divat öcelszeru az Exception osztalybíl lesza rmaztatni ú ne a RuntimeException osztalybíl ösima osztalydefinıcií öeltarolhatunk egy kivetelben informaciít a fellepes okaríl 11
public class VeremMegteltException extends Exception { public VeremMegteltException(){ super(); public VeremMegteltException( String s ){ super(s); public Object nemfertbele; public VeremMegteltException( Object o ){ nemfertbele = o; Kivetel kiva lta sa öa sajat kiveteleinket mi magunk valthatjuk ki, jelezve a kiveteles esemeny beko vetkezeset öa predefinit kiveteleket is kivalthatjuk, s t, akar meg Error-okat is öa throw kulcsszít kell hasznalni, es utana megadni egy kivetel peldanyt public void push( Object o ) throws VeremMegteltException { if( tele() ) throw new VeremMegteltException(o); else (to mbo s abrazolas) public void push( Object o ) throws VeremMegteltException { elemek[veremteto] = o; veremteto ++; catch( ArrayIndexOutOfBoundsException e ){ throw new VeremMegteltException(o); Feladat öa Sor osztaly kiegeszıtese sajat kivetelosztalyokkal es kivetelkezelessel öa matrixo sszeadasos program kiegeszıtese sajat kivetelosztallyal es kivetelkezelessel 12
Kivetel üjrakiva lta sa ölehet, hogy egy ponton meg nem tudunk teljesen lekezelni egy kivetelt ötovabb is adjuk a hıvínak önem hozunk letre üj kivetelpeldanyt öes a fillinstacktrace catch ( Exception e ){ log.println(e); throw e; öilyenkor latszik, hogy a kivetel nem itt keletkezett öa printstacktrace() kimutatja public static void main( String args[] ){ elso(); static void elso(){ masodik(); static void masodik() { throw new NullPointerException(); Exception in thread "mainá java.lang.nullpointerexception at A.masodik(A.java:10) at A.elso(A.java:7) at A.main(A.java:4) public static void main( String args[] ){ try{ elso(); catch( Exception e ){ System.err.println(e); static void elso(){ masodik(); static void masodik() { throw new NullPointerException(); java.lang.nullpointerexception public static void main( String args[] ){ try{ elso(); catch( Exception e ){ e.printstacktrace(); static void elso(){ masodik(); static void masodik() { throw new NullPointerException(); Exception in thread "mainá java.lang.nullpointerexception at A.masodik(A.java:15) at A.elso(A.java:10) at A.main(A.java:4) 13
public static void main( String args[] ){ elso(); static void elso(){ masodik(); catch( NullPointerException e ){ throw e; static void masodik() { throw new NullPointerException(); Exception in thread "mainá java.lang.nullpointerexception at A.masodik(A.java:10) at A.elso(A.java:5) at A.main(A.java:2) public static void main( String args[] ){ elso(); static void elso(){ masodik(); catch( NullPointerException e ) { e.fillinstacktrace(); throw e; static void masodik() { throw new NullPointerException(); Exception in thread "mainá java.lang.nullpointerexception at A.elso(A.java:7) at A.main(A.java:2) Feladat öaz osztasos peldaban dobjuk el üjra a kivetelt, ha a 0/0 eset van. Polimorfizmus es kivetelek ömetídus feléldefinialasakor az üj metídus altal kivalthatí kivetelek csak specifikusabbak lehetnek öazaz a leszarmazott metídusa nem valthat ki to bb kivetelt, mint az s metídusa ökivetel elmaradhat, vagy lehet helyette specifikusabb (leszarmazott kivetel) public void m(int i) throws IOException, InterruptedException { class B extends A { public void m(int i) throws EOFException { 14