You are on page 1of 12

Chng 7

X L NGOI L (Exception Handling)


Sau khi kt thc chng ny, bn c th nm c cc ni dung sau: nh ngha mt ngoi l (exception) Hiu c mc ch ca vic x l ngoi l Hiu c cc kiu ngoi l khc nhau trong Java M t m hnh x l ngoi l Hiu c cc khi lnh cha nhiu catch M t cch s dng cc khi try, catch v finally Gii thch cch s dng cc t kho throw v throws T to ra cc ngoi l

7.1 Gii thiu


Exception l mt li c bit. Li ny xut hin vo lc thc thi chng trnh. Cc trng thi khng bnh thng xy ra trong khi thi hnh chng trnh to ra cc exception. Nhng trng thi ny khng c bit trc trong khi ta ang xy dng chng trnh. Nu bn khng phn phi cc trng thi ny th exception c th b kt thc t ngt. V d, vic chia cho 0 s to mt li trong chng trnh. Ngn ng Java cung cp b my dng x l ngoi l rt tuyt vi. Vic x l ny lm hn ch ti a trng hp h thng b ph v (crash) hay h thng b ngt t ngt. Tnh nng ny lm cho Java l mt ngn ng lp trnh mnh.

7.2 Mc ch ca vic x l ngoi l


Mt chng trnh nn c c ch x l ngoi l thch hp. Nu khng, chng trnh s b ngt khi mt exception xy ra. Trong trng hp , tt c cc ngun ti nguyn m h thng trc kia phn phi s c di di trong cng trng thi. iu ny gy lng ph ti nguyn. trnh trng hp ny, tt c cc ngun ti nguyn m h thng phn phi nn c thu hi li. Tin trnh ny i hi c ch x l ngoi l thch hp. Cho v d, xt thao tc nhp xut (I/O) trong mt tp tin. Nu vic chuyn i kiu d liu khng thc hin ng, mt ngoi l s xy ra v chng trnh b hy m khng ng li tp tin. Lc tp tin d b h hi v cc ngun ti nguyn c cp pht cho tp tin khng c thu hi li cho h thng.

7.3 X l ngoi l
Khi mt ngoi l xy ra, i tng tng ng vi ngoi l c to ra. i tng ny sau c truyn cho phng thc l ni m ngoi l xy ra. i tng ny cha thng tin chi tit v ngoi l. Thng tin ny c th c nhn v v c x l. Cc mi trng runtime nh IllegalAccessException, EmptyStackException v.v c th chn c cc ngoi l. on m trong chng trnh i khi c th to ra cc ngoi l. Lp throwable

Chng 7: X l ngoi l (Exception Handling)

27

c Java cung cp l lp trn nht ca lp Exception , lp ny l lp cha ca cc ngoi l khc nhau.

7.4 M hnh x l ngoi l


Trong Java, m hnh x l ngoi l kim tra vic x l nhng hiu ng l (li), c bit n l m hnh catch v throw. Trong m hnh ny, khi mt li xy ra, mt ngoi l s b chn v c a vo trong mt khi. Ngi lp trnh vin nn xt cc trng thi ngoi l c lp nhau t vic iu khin thng thng trong chng trnh. Cc ngoi l phi c bt gi nu khng chng trnh s b ngt. Ngn ng Java cung cp 5 t kho sau x l cc ngoi l: try catch throw throws finally

Di y l cu trc ca m hnh x l ngoi l: try { } catch(Exception e1) { // If an exception is thrown in try, which is of type e1, then perform // necessary actions here, else go to the next catch block } catch(Exception e2) { // If an exception is thrown in, try which is of type e2, then perform // necessary actions here, else go to the next catch block } catch(Exception eN) { // If an exception is thrown in, try which is of type eN, then perform // necessary actions here, else go to the next catch block } finally { // this book is executed, whether or not the exception is throw. } // place code that is expected to throw an exception

7.4.1 Cc u im ca m hnh catch v throw

28

Core Java

M hnh catch v throw c hai u im: Ngi lp trnh vin phi phn phi trng thi li ch vo nhng ni cn thit. Khng cn phi thc hin ti mi mc. Mt thng bo li c th c in ra khi tin hnh x l ngoi l.

7.4.2 Cc khi try v catch


Khi try-catch c s dng thi hnh m hnh catch v throw ca vic x l ngoi l. Khi try cha mt b cc lnh c th thi hnh c. Cc ngoi l c th b chn khi thi hnh nhng cu lnh ny. Phng thc dng chn ngoi l c th c khai bo trong khi try. Mt hay nhiu khi catch c th theo sau khi try. Cc khi catch ny bt cc ngoi l b chn trong khi try. Hy nhn khi try di y: try { doFileProcessing(); // user-defined method displayResults(); } catch (Exception e) // exception object { System.err.println(Error : + e.toString()); e.printStackTrace(); } y, e l i tng ca lp Exception. Chng ta c th s dng i tng ny in cc chi tit v ngoi l. Cc phng thc toString v printStackTrace c s dng m t cc exception pht sinh ra. Hnh sau ch ra kt xut ca phng thc printStackTrace().

Hnh 7.1 Khi Try v Catch bt gi bt c ngoi l no, ta phi ch ra kiu ngoi l l Exception. catch(Exception e) Khi ngoi l b bt gi khng bit thuc kiu no, chng ta c th s dng lp Exception bt ngoi l .

Chng 7: X l ngoi l (Exception Handling)

29

Khi catch() bt gi bt c cc li xy ra trong khi thi hnh phng thc doFileProcessing hay display. Nu mt li xy ra trong khi thi hnh phng thc doFileProcessing(), lc phng thc displayResults() s khng bao gi c gi. S thi hnh s tip tc thc hin khi catch. c nhiu lp x l li hn, nh l LookupException thay v mt i tng ngoi l chung (Exception e), li tht s s l mt instance ca LookupException hay mt trong s nhng lp con ca n. Li s c truyn qua khi try catch cho ti khi chng bt gp mt catch tham chiu ti n hay ton b chng trnh phi b hu b.

7.5 Cc khi cha nhiu Catch


Cc khi cha nhiu catch x l cc kiu ngoi l khc nhau mt cch c lp. Chng c lit k trong on m sau: try { doFileProcessing(); // user defined mothod displayResults(); // user defined method } catch(LookupException e) // e Lookupexception object { handleLookupException(e); // user defined handler } catch(Exception e) { System.err.println(Error: + e.printStackTrace()); } } Trong trng hp ny, khi catch u tin s bt gi mt LockupException. Khi catch th hai s x l kiu ngoi l khc vi khi catch th nht. Mt chng trnh cng c th cha cc khi try lng nhau. V d on m di y: try { statement 1; statement 2; try { statement1; statement2; } catch(Exception e) // of the inner try block { }

30

Core Java

} catch(Exception e) // of the outer try block { } Khi s dng cc try lng nhau, khi try bn trong c thi hnh u tin. Bt k ngoi l no b chn trong khi try s b bt gi trong cc khi catch theo sau. Nu khi catch thch hp khng c tm thy th cc khi catch ca cc khi try bn ngoi s c xem xt. Nu khng, Java Runtime Environment x l cc ngoi l. chng trnh 7.1 minh ha cch s dng cc khi try v catch. Chng trnh 7.1 class TryClass { public static void main(String args[]) { int demo=0; try { System.out.println(20/demo); } catch(ArithmeticException a) { System.out.println(Cannot Divide by zero); } } } Kt xut ca chng trnh:

Hnh 7.2 ArithmeticException Trong chng trnh ny, mt s c chia cho 0. y khng l ton t s hc hp l. Do mt ngoi l b chn v c bt gi trong khi catch. Khi ngi lp trnh vin nhn bit c loi ngoi l no c th xy ra, anh ta hay c ta vit mt cu lnh trong khi catch. y, a c s dng nh mt i tng ca Arithmaticexception in cc chi

Chng 7: X l ngoi l (Exception Handling)

31

tit v cc ton t ngoi l m h thng cung cp. Nu bn thay th lnh System.out.println ca khi catch bng lnh System.out.println(a.getMessage()) th kt xut ca chng trnh nh sau:

Hnh 7.3 Cu thng bo li Khi cc khi try c s dng m khng c cc khi catch no, chng trnh s bin dch m khng gp s c no nhng s b ngt khi thc thi. Bi v ngoi l xy ra khi thc thi chng trnh.

7.6 Khi finally


Khi mt ngoi l xut hin, phng thc ang c thc thi c th b dng m khng c thi hnh ton vn. Nu iu ny xy ra, th cc on m (v d nh on m vi chc nng thu hi ti nguyn c cc lnh ng li tp tin khai bo cui phng thc) s khng bao gi c gi. Java cung cp khi finally gii quyt vic ny. Khi finally thc hin tt c cc vic thu dn khi mt ngoi l xy ra. Khi ny c th c s dng kt hp vi khi try. Khi finally cha cc cu lnh thu hi ti nguyn v cho h thng hay lnh in ra cc cu thng bo. Cc lnh ny bao gm: ng tp tin. ng li b kt qu (c s dng trong chng trnh c s d liu). ng li cc kt ni c to trong c s d liu. try {

doSomethingThatMightThrowAnException();

} finally { cleanup(); } Phng thc cleanup() c gi nu phng thc doSomethingThatMightThrowAnException() chn mt ngoi l. Mt khc cleanup() cng c gi ngay khi khng c ngoi l no b chn v thi hnh tip tc sau khi lnh finally. Khi finally l tu , khng bt buc. Khi ny c t sau khi catch. H thng s duyt t cu lnh u tin ca khi finally sau khi gp cu lnh return hay lnh break

32

Core Java

c dng trong khi try. Khi finally bo m lc no cng c thc thi, bt chp c ngoi l xy ra hay khng. Hnh 7.4 minh ha s thi hnh ca cc khi try, catch v finally.
try block No Exception Exception occurs

finally block

catch block

finally block

Hnh 7.4 Khi lnh try, catch v finally Hnh 7.2 s dng khi finally. y, khi finally c thi hnh bt chp ArithmeticException c xy ra hay khng. Khi ny khai bo cc hot ng thu dn. Chng trnh 7.2 class FinallyDemo { String name; int no1,no2; FinallyDemo(String args[]) { try { name=new String(Aptech Limited); no1=Integer.parseInt(args[0]); no2=Integer.parseInt(args[1]); System.out.println(name); System.out.println(Division Result is + no1/no2); } catch(ArithmeticException i) { System.out.println(Cannot Divide by zero); } finally { name=null; // clean up code System.out.println(Finally executed); } } public static void main(String args[])
Chng 7: X l ngoi l (Exception Handling) 33

{ } }

new FinallyDemo(args);

Kt xut ca chng trnh:

Hnh 7.5 Khi Finally Trong v d ny, cc cu lnh trong khi Finally lun lun thi hnh, bt chp ngoi l c xy ra hay khng. Trong kt xut bn trn, khi finally c thi hnh mc d khng c ngoi l xy ra.

7.7 Cc ngoi l c nh ngha vi lnh throw v throws


Cc ngoi l b chn vi s tr gip ca t kho throw. T kha throw ch ra mt ngoi l va xy ra. Ton t ca throw l mt i tng ca lp, lp ny c dn xut t Throwable. on lnh sau ch ra cch s dng ca lnh throw: try { if (flag<0) { throw new MyException(); // user-defined } } Mt phng thc n c th chn nhiu ngoi l. x l nhng ngoi l ny, ta cn cung cp mt danh sch cc ngoi l m phng thc chn trong phn nh ngha ca phng thc. Gi s rng phng thc x() gi phng thc y(). Phng thc y() chn mt ngoi l khng c x l. Trong trng hp ny, phng thc gi x() nn khai bo vic chn cng mt ngoi l vi phng thc c gi y(). Ta nn khai bo khi try catch trong phng thc x() m bo rng ngoi l khng c truyn cho cc phng thc m gi phng thc ny.

34

Core Java

on m sau minh ha cch s dng ca t kho throws x l nhiu ngoi l: public class Example { // multiple exceptions separated by a comma public void exceptionExample() throws ExException, LookupException { try { // statements } catch(ExException exmp) { } catch(LookupException lkpex) { } } } Trong v d trn, phng thc exceptionExample khai bo t kho throws. T kho ny c theo sau bi danh sch cc ngoi l m phng thc ny c th chn Trong trng hp ny l ExException v LookupException. Hm x l ngoi l cho cc phng thc ny nn khai bo cc khi catch c th x l tt c cc ngoi l m cc phng thc chn. Lp Exception thc thi giao din Throwable v cung cp cc tnh nng hu dng phn phi cc ngoi l. u im ca n l to cc lp ngoi l c nh ngha bi ngi dng. lm iu ny, mt lp con ca lp Exception c to ra. u im ca lp con l mt kiu ngoi l mi c th b bt gi c lp t cc loi Throwable khc. Chng trnh 7.3 minh ha ngoi l c nh ngha bi ngi dng ArraySizeException: Chng trnh 7.3 class ArraySizeException extends NegativeArraySizeException { ArraySizeException() // constructor { super(You have passed an illegal array size); } } class ThrowDemo { int size, array[]; ThrowDemo(int s) { size=s;

Chng 7: X l ngoi l (Exception Handling)

35

try { checkSize(); } catch(ArraySizeException e) { System.out.println(e); } } void checkSize() throws ArraySizeException { if (size < 0) throw new ArraySizeException(); else System.out.println(The array size is ok.); array = new int[3]; for (int i=0; i<3; i++) array[i] = i+1; } public static void main(String arg[]) { new ThrowDemo(Integer.parseInt(arg[0])); }

Lp c nh ngha bi ngi dng ArraySizeException l lp con ca lp NegativeArraySizeException. Khi mt i tng c to t lp ny, thng bo v ngoi l c in ra. Phng thc checkSize() c gi chn ngoi l ArraySizeException m c ch ra bi mnh throws. Kch thc ca mng c kim tra trong cu trc if. Nu kch thc l s m th i tng ca lp ArraySizeException c to. Phng thc call() c bao quanh trong khi try-catch, l ni m gi tr ca i tng c in ra. Phng thc call() cn c bao trong khi try, cho khi catch tng ng c th in ra gi tr. Kt xut ca chng trnh c ch ra hnh 7.6.

Hnh 7.6 Ngoi l t nh ngha

36

Core Java

7.8 Danh sch cc ngoi l


Bng sau y lit k mt s ngoi l: Ngoi l RuntimeException ArthmeticException IllegalAccessException IllegalArgumentException ArrayIndexOutOfBoundsExeption NullPointerException SecurityException ClassNotFoundException NumberFormatException AWTException IOException FileNotFoundException EOFException NoSuchMethodException InterruptedException Bng 7.1 Danh sch mt s ngoi l Lp cha ca th t phn cp ngoi l Lp c s cho nhiu ngoi l java.lang Trng thi li v s, v d nh chia cho 0 Lp khng th truy cp Phng thc nhn mt i s khng hp l Kch thc ca mng ln hn 0 hay ln hn kch thc tht s ca mng Khi mun truy cp i tng null Vic thit lp c ch bo mt khng c hot ng Khng th np lp yu cu Vic chuyn i khng thnh cng t chui sang s thc Ngoi l v AWT Lp cha ca cc ngoi l I/O Khng th nh v tp tin Kt thc mt tp tin Phng thc yu cu khng tn ti Khi mt lung b ngt

Tm tt
Bt c khi no mt li xut hin trong khi thi hnh chng trnh, ngha l mt ngoi l xut hin. Ngoi l pht sinh vo lc thc thi chng trnh theo trnh t m. Mi ngoi l pht sinh ra phi b bt gi , nu khng ng dng s b ngt. Vic x l ngoi l cho php bn kt hp tt c tin trnh x l li trong mt ni. Lc on m ca bn s r rng hn. Java s dng cc khi try v catch x l cc ngoi l. Cc cu lnh trong khi try chn ngoi l cn khi catch x l ngoi l. Cc khi cha nhiu catch c th c s dng x l cc kiu ngoi l khc nhau theo cch khc nhau. T kho throw lit k cc ngoi l m phng thc chn. T kho throw ch ra mt ngoi l va xut hin. Khi finally khai bo cc cu lnh tr v ngun ti nguyn cho h thng v in nhng cu thng bo. !!! Check your progress & Exercise !!!

Chng 7: X l ngoi l (Exception Handling)

37

38

Core Java

You might also like