Kivetelek Java tutorial Copyright á 2000-2001, Kozsik Tama s
Hiba k öMa s nyelvekben elkepzelhet˝, hogy egy hiba fejrea llıtja a programot ú Jí esetben csak elsza ll ú Esetleg nagy butasa got csina l, pl. elrontja az adatba zist
öJava-ban a futtatí rendszer ellen˝rzi a hiba kat
Kivetel != Hiba öA kivetelek nem mindig hiba t jeleznek öLehet, hogy csak egy ritka n beko vetkez˝, vagy a feladat szempontja bíl kevesbe fontos esemenyt
öA program vegrehajta sa sora n ritka n beko vetkez˝ esemenyek öNem a ” f˝ vegrehajta si a gű ; logikailag alacsonyabbrendu feladat jelzese öHiba öFelhaszna lí butasa got csina l öSpecia lis/abnorma lis sza mıta si eredmeny
Milyen hiba k vannak? öNulla val valí oszta s öTo mb tülindexeles öHivatkoza s ” nullű mutatín keresztÉl öE rtek tül/alulcsordula s öNincs meg egy fa jl öHa lízati kapcsolat megszakad
Kivetel kezelese öEgy jíl megırt, megbızhatí program jelent˝s resze a kiveteles esemenyekkel foglalkozik öJí, ha van programnyelvi ta mogata s erre
1 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Ha nincs kivetelkezelesre ta mogata s öPl. C-ben, Pascal-ban nincs specia lis eszko z a kivetelek kezelesere öMegolda s: visszateresi hibakídok, plussz parameterek, esetvizsga latok (ela gaza sok) öÁ vagy egyszeru en semmi Á ú lustasa g ú olvashatísa g, elegancia
Kivetelkezelest ta mogatí nyelvi elemek öKis er˝feszıtessel, az olvashatísa got es az elegancia t megtartva lehessen kiveteleket kezelni öA ltala ban a kiveteleket kezel˝ kídot elva lasztja k a to bbit˝l, a ” lenyegt˝lű öAz elkeszÉlt programok megbızhatísa ga t, olvashatísa ga t no velik
Tartalom öKivetelek fellepese öKivetelek terjedese öKivetelek lekezelese öKivetelek tova bbterjedesenek specifika la sa öKivetelek definia la sa öKivetelek kiva lta sa öKÉlo nbo z˝ kivetelfajta k
Kivetel fellepese öA program egy pontja n, egy utasıta s vegrehajta sa ko zben öJelezhet hiba t, vagy specia lis esemenyt öNullPointerException, ArrayIndexOutOfBoundsException ClassCastException IOException
Java tutorial Copyright á 2000-2001, Kozsik Tama s
Pelda class A { public static void main(String args[]){ int[] t; t[0] = 12; // fordıtasi hiba t = new int[3]; t[3] = 21; } }
2 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Pelda
Pelda
class A { public static void main(String args[]){ int[] t = null; t[0] = 12; // NullPointerException t = new int[3]; t[3] = 21; } }
class A { public static void main(String args[]){ int[] t; // t[0] = 12; t = new int[3]; t[3] = 21; // ArrayIndexOutOfBoundsE. } }
Kivetelek terjedese öA hıva si la nc menten
Java tutorial Copyright á 2000-2001, Kozsik Tama s
ú A vegrehajta si 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 lea ll a program, es kiırja a kivetelt ú stack trace
Pelda class A { public static void main(String args[]){ 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 informa cií ú ú ú ú
Melyik vegrehajta si sza l Milyen kivetel (hiba) lepett fel Melyik fa jlban, melyik sorban, melyik metídusban Milyen hıva si la nc menten terjedt
3 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Feladat öVa ltsunk ki egy hiba t: osszunk le egy egesz sza mot nulla val öEl˝szo r a f˝programban öPríba ljuk 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ıva si la ncon lekezelhetjÉk öEgy specia lis vezerlesi szerkezet: try catch finally
Pelda class A { public static void main(String args[]){ m1(3); m1(80); } static void m1( int i ) { int[] t = new int[i]; try { m2(t); } catch (Exception e){} } static void m2( int[] t ){ t[7] = 12; } }
Java tutorial Copyright á 2000-2001, Kozsik Tama s
Pelda class A { public static void main(String args[]){ m1(3); m1(80); } static void m1( int i ) { int[] t = new int[i]; try { m2(t); } catch (Exception e){} } static void m2( int[] t ){ t[7] = 12; } }
Pelda class A { public static void main(String args[]){ m1(3); m1(80); } static void m1( int i ) { int[] t = new int[i]; try { m2(t); } catch (Exception e){...} } static void m2( int[] t ){ t[7] = 12; } }
4 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Pelda
Hogyan kezeljÉnk le egy kivetelt öValami ertelmes dolgot csina ljunk
static void m1( int i ) { int[] t = new int[i]; try { m2(t); } catch (Exception e){ System.out.println(e); } }
öPríba ljuk folytatni a mu ko dest a kivetel (pl. hiba) ellenere öHa rıtsuk el a hiba t, es príba lkozzunk üjra öMentsÉk, ami menthet˝ ú Za rjuk le a fa jlokat, adatba zist...
A hiba kiıra sa öSok programozí kiıratja, hogy hiba to rtent, es kilep a programbíl öE rtelmetlen mídja a hiba ” lekezelesenekű öAmügy is kiırta volna a virtua lis gep...
Copyright á 2000-2001, Kozsik Tama s
try - catch
Pelda
öVedett blokk: try öKivetelkezel˝ a gak: catch öEgy vedett blokkhoz to bb kivetelkezel˝ a g
Java tutorial
try { ... } catch (NullPointerException e){ ... } catch (IOException e){ ... } catch (InterruptedException e){ ... }
ú KÉlo nbo z˝ kivetelekhezÁ
öA kivetel fajta ja tíl fÉgg, melyik kivetelkezel˝ a g aktiviza lídik
5 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Pelda try { ... } catch (NullPointerException e){ ... } catch (IOException e){ ... } catch (InterruptedException e){ ... }
Pelda try { ... IOException felle p } catch (NullPointerException e){ ... } catch (IOException e){ ... } catch (InterruptedException e){ ... }
A kivetelkezel˝ keresese öHa a try blokkban kivetel lep fel, akkor a hozza tartozí catch a gakban keres a JVM kivetelkezel˝t öSorba nezi a catch a gakat, az els˝ megfelel˝ to rzset vegrehajtja öMegfelel˝: ha a kivetel fajta ja beletartozik a specifika lt kiveteloszta lyba
Feladat öAz el˝bbi feladat folytata sa: kezeljÉk le a kivetelt az oszta st vegz˝ metídusban.
A kivetelek is objektumok Java tutorial Copyright á 2000-2001, Kozsik Tama s
öA kivetel fajta ja - az objektum oszta lya öA kivetelek hierarchia ba vannak szervezve: az oszta lyhierarchia a ltal öBeletartozik egy kategíria ba: altıpusossa g
6 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Pelda try { ... EOFException felle p } catch (NullPointerException e){ ... } catch (IOException e){ ... } catch (InterruptedException e){ ... }
Ha nincs megfelel˝ catch a g öHa nem tala lunk megfelel˝ kivetelkezel˝t, akkor a kivetel tova bbterjed ú Mintha nem is lett volna kivetelkezel˝ resz
öA hıvíban üjbíl lehet˝segÉnk van a kivetel lekezelesere
Pelda try { ... 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, inka bb engedjÉk, hogy a program elsza lljon
Java tutorial Copyright á 2000-2001, Kozsik Tama s
Feladat öAz el˝z˝ feladat folytata sa: a metídus legyen fÉggveny, ami visszaadja az oszta s eredmenyet. A f˝program kezeli le a kivetelt. Irja ki, hogy az oszta s eredmenye pozitıv vagy negatıv vegtelen, vagy esetleg definia latlan. (0/0)
7 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Ha sikerÉl lekezelni a kivetelt öA futa s a kivetelkezel˝ resz uta n folytatídik ú Nem ” megy visszaű a try-ba, ahol fellepett
Java tutorial Copyright á 2000-2001, Kozsik Tama s
Ha nem sikerÉl lekezelni a kivetelt öA kivetel a hıva s helyen fellep ú Az adott metídus vegrehajta sa megszakad
try { } catch ( <exc 1> ) { } catch ( <exc 2> ) { } catch ( <exc 3> ) { }
A kivetelkezel˝ a gak sorrendje öA szu kebb meg kell, hogy el˝zze a b˝vebbet try { ... } catch( IOException e1 ){ ... } catch( EOFException e2 ){ ... }
try { } catch ( <exc 1> ) { } catch ( <exc 2> ) { } catch ( <exc 3> ) { }
A kivetelkezel˝ a gak sorrendje öA szu kebb meg kell, hogy el˝zze a b˝vebbet try { ... } catch( EOFException e1 ){ ... } catch( IOException e2 ){ ... }
öEz ıgy jí.
finally öA try blokk es a catch a gak uta n ırhatí egy finally blokk öAzokat az utasıta sokat tartalmazza, amelyeket mindenfe leke ppen vegre kell hajtani.
öEz nem jí. Fordıta si hiba. ú A ma sodik sohasem va lasztídhat ki.
8 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Pelda
try { ... } catch( ... ){ ... } catch( ... ){ ... } finally { ... }
Pelda try { ... } catch( ... ){ ... } catch( ... ){ ... } finally { ... }
finally: mindenkeppen öHa nem lepett fel kivetel... öHa fellepett, de nem tala lunk megfelel˝ kivetelkezel˝ a gat... öHa tala lunk...: akkor uta na
Tova bbterjedes specifika la sa öHa egy kivetel fellep egy metídusban, akkor: vagy le kell kezelni vagy jelezni kell, hogy tova bbadhatjuk öA metídusok specifika ciíja tartalmazza a metídusban fellep˝ lehetseges kiveteleket öA parameterlista es a to rzs ko zo tt öthrows utasıta s
Java tutorial Copyright á 2000-2001, Kozsik Tama s
Pelda public static void main(String args[]){ try { InputStream in = new FileInputStream("input.txt"); ... } catch (IOException e) { ... } }
9 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Pelda public static void main(String args[]) throws IOException { InputStream in = new FileInputStream("input.txt"); ... }
Szaba lyozott terjedes öHa egy mu velet kiva lthat egy kivetelt, akkor a mu velet haszna líja tudni fog ríla öPl. lekezelheti öHa nem, neki is specifika lnia kell, ıgy az ˝t haszna lí is tudoma st szerez a kivetelr˝l öA kivetel olyan, mint egy specia lis visszateresi ertek
RuntimeException
Mik ezek
öVannak olyan kivetelek, amelyeket nem kell lekezelni vagy a tova bbterjedeset specifika lni öTül sok helyen fellephetnek
öNullPointerException
ú Lenyegeben a program minden pontja n
öArithmeticException
öElbonyolıtana a programot, ha ... öA ltala ban programozíi hiba t jelentenek, nem ” kiveteles esemenytű
ú Ba rmelyik objektumhivatkoza sna l
öArrayIndexOutOfBoundsException ú Ba rmelyik to mbindexelesnel ú Ba rmelyik egesz oszta skor
östb.
Programozíi hiba k öA programozí a ltala ban ügy ırja meg a programja t, hogy vigya z arra, hogy ne legyenek programozíi hiba k öSokszor felesleges hibakezelest betenni, vagy specifika lni a tova bbterjedest öPersze megengedett mind a lekezeles, mind a tova bbterjedes specifika ciíja
Java tutorial Copyright á 2000-2001, Kozsik Tama s
10 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
A kiveteloszta lyok hierarchia ja Az Error lesza rmazottjai
Throwable
Error
InternalError
öFata lis hiba k: ma r nincs mit tenni... öNem ko telez˝ lekezelni vagy a terjedest specifika lni öPelda ul:
Exception
stb
RuntimeException
NullPointerException
stb
IOException
EOFException
Saja tException
stb
ú OutOfMemoryError InstantiationError NoClassDefFoundError StackOverflowError
ClassFormatError LinkageError VirtualMachineError
stb
A RuntimeException lesza rmazottai öAz el˝bb ma r beszeltÉnk ríluk öProgramozíi hiba t jeleznek öNullPointerException ArrayIndexOufOfBoundsException ArithmeticException
Az Exception egyeb lesza rmazottai öEzekb˝l van a legto bb öKiveteles esemeny öVagy lekezeljÉk, vagy specifika ljuk a terjedesÉket öPelda ul ú IOException, FileNotFoundException, InterruptedException, SQLException
Saja t kiveteloszta lyok Java tutorial Copyright á 2000-2001, Kozsik Tama s
öSaja t kiveteles esemenyek jelzese öNagy divat... öCelszeru az Exception oszta lybíl lesza rmaztatni ú ne a RuntimeException oszta lybíl
öSima oszta lydefinıcií öElta rolhatunk egy kivetelben informa ciít a fellepes oka ríl
11 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Pelda public class VeremMegteltException extends Exception { public VeremMegteltException(){ super(); } public VeremMegteltException( String s ){ super(s); } public Object nemFertBele; public VeremMegteltException( Object o ){ nemFertBele = o; } }
Pelda public void push( Object o ) throws VeremMegteltException { if( tele() ) throw new VeremMegteltException(o); else ... }
Kivetel kiva lta sa öA saja t kiveteleinket mi magunk va lthatjuk ki, jelezve a kiveteles esemeny beko vetkezeset öA predefinit kiveteleket is kiva lthatjuk, s˝t, aka r meg Error-okat is öA throw kulcsszít kell haszna lni, es uta na megadni egy kivetel pelda nyt
Pelda (to mbo s a bra zola s) public void push( Object o ) throws VeremMegteltException { try { elemek[veremteto] = o; veremteto ++; } catch( ArrayIndexOutOfBoundsException e ){ throw new VeremMegteltException(o); } }
Feladat öA Sor oszta ly kiegeszıtese saja t kiveteloszta lyokkal es kivetelkezelessel öA ma trixo sszeada sos program kiegeszıtese saja t kiveteloszta llyal es kivetelkezelessel
Java tutorial Copyright á 2000-2001, Kozsik Tama s
12 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Pelda
Kivetel üjrakiva lta sa
try { ... } catch ( Exception e ){ log.println(e); throw e; }
öLehet, hogy egy ponton meg nem tudunk teljesen lekezelni egy kivetelt öTova bb is adjuk a hıvínak öNem hozunk letre üj kivetelpelda nyt öes a fillInStackTrace
öIlyenkor la tszik, hogy a kivetel nem itt keletkezett öA printStackTrace() kimutatja
Pelda class A {
Pelda class A {
public static void main( String args[] ){ elso(); }
public static void main( String args[] ){ try{ elso(); } catch( Exception e ){ System.err.println(e); } }
static void elso(){ masodik(); } 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)
static void masodik() { throw new NullPointerException(); } } java.lang.NullPointerException
Pelda class A { public static void main( String args[] ){ try{ elso(); } catch( Exception e ){ e.printStackTrace(); } }
Java tutorial
static void elso(){ masodik(); }
Copyright á 2000-2001, Kozsik Tama s
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 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com
Pelda class A { public static void main( String args[] ){ elso(); } static void elso(){ try { 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)
Feladat öAz oszta sos pelda ban dobjuk el üjra a kivetelt, ha a 0/0 eset van.
Pelda class A { public static void main( String args[] ){ elso(); } static void elso(){ try { 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)
Polimorfizmus es kivetelek öMetídus felÉldefinia la sakor az üj metídus a ltal kiva lthatí kivetelek csak specifikusabbak lehetnek öAzaz a lesza rmazott metídusa nem va lthat ki to bb kivetelt, mint az ˝s metídusa öKivetel elmaradhat, vagy lehet helyette specifikusabb (lesza rmazott kivetel)
Pelda class A { public void m(int i) throws IOException, InterruptedException { ... } } class B extends A { public void m(int i) throws EOFException { ... } }
Java tutorial Copyright á 2000-2001, Kozsik Tama s
14 PDF created with FinePrint pdfFactory trial version http://www.fineprint.com