Trang 92 Chng 3: X LÝ NGOI L i vi ngi lp trình h có th gp mt trong các li sau: - Li cú pháp (syntac error) - Li logic thut toán - Li lúc thc thi ( runtime error) -i vi li cú pháp ngi lp trình có th phát hin và sa li, da vào trình biên dch, ây là li d phát hin và sa cha, tuy nhiêmn ây cng là li gây khó khn và chán nn i vi ngi mi hc lp trình. -i vi li thut toán, ây là li khó phát hin và sa cha nht, tuy nhiên trong bài này ta không bàn lun v vn này. -i vi li lúc thc thi, ta hoàn toàn có th kim soát c chúng, thông thng li runtime thng do nguyên nhân khách quan nh: truy cp vào mt a nhng a này li cha sn sàng, hay thc hin phép chia nhng mu s li bng 0, kt ni vi máy tính xa nhng máy ó li không tn ti…, khi mt li runtime xy ra JVM s phát sinh mt ngoi l, nu mt chng trình không cung cp mã s lý ngoi l có th kt thúc không bình thng, trong bài hôm nay ta s bàn v vn s lý ngoi l trong java. - Mi lp bit l trong java u c dn xut t lp c s Throwable, ta có th to ra lp ngoi l riêng bng cách m rng lp Throwable I. Mc ích ca vic x lý ngoi l Mt chng trình nên có c ch x lý ngoi l thích hp. Nu không, chng trình s b ngt khi mt ngoi l xy ra. Trong trng hp ó, tt c các ngun tài nguyên mà h thng ã cp không c gii phóng. u này gây lãng phí tài nguyên. tránh trng hp này, tt c các ngun tài nguyên mà h thng cp nên c thu hi li. Tin trình này òi hi c ch x lý ngoi l thích hp. Ví d, xét thao tác vào ra (I/O) trong mt tp tin. Nu vic chuyn i kiu d liu không thc hin úng, mt ngoi l s xy ra và chng trình b hy mà không óng tp tin li. Lúc ó tp tin d b h hi và các ngun tài nguyên c cp phát cho tp tin không c tr li cho h thng. II. Mô hình s lý ngoi l ca java Mô hình s lý ngoi l ca java da trên ba hot ng chính: c t ngoi l, ném ra ngoi l, và bt ngoi l. - Mi phng thc u có th phát sinh các ngoi l, các ngoi l có th phát sinh cn c mô t chi tit trong lnh khai báo ca phng thc, vic khai báo này c gi là c t ngoi l. - Khi mt câu lnh trong phng thc gây li, mà ngi lp trình không cung cp mã x lý li, thì ngoi lc chuyn n phng thc gi phng thc ó, vic này c gi là ném ra bit l, ta có th ném ra bit l mt cách tng minh (iu này sc gii thiu sau). - Sau khi JVM ném ra mt ngoi l, thì h thng thi hành java bt u tin trình tìm mã x lý li. Mã x lý li hay còn gi là mã x lý bit l, java runtime s tìm mã x lý li bng cách ln ngc tr li chui các phng thc gi nhau, bt u t phng thc hin ti. Chng trình s kt thúc nu không tìm thy mã x lý bit l. Quá trình tìm kim này gi là bt bit l. Trang 93 III. c t ngoi l c t ngoi l là khai báo cho trình biên dch bit là phng thc này có th gây ra ngoi l lúc thi hành. khai báo bit l ta s dng t khoá throws trong khai báo phng thc, ví d: public void myMethod() throws IOException, RemoteException t khoá throws ch cho trình biên dch java bit rng phng thc này có th ném ra ngoi l IOException và RemoteException, nu mt phng thc ném ra nhiu ngoi l thì các ngoi lc khai báo cách nhau bi du phy ‘,’ III. Ném ra ngoi l Mt phng thc sau khi ã khai báo các bit l, thì bn (hoc chng trình thc thi java) có th ném ra các i tng bit l, có kiu mà ta ã khai báo trong danh sách throws. Cú pháp ca lnh ném ra ngoi l: throw ExceptionObject; Chú ý: - Bn phi chú ý gia lnh khai báo bit l và lnh ném ra ngoi l - Mt phng thc ch có th ném ra các ngoi l mà nó c khai báo IV. Bt ngoi l Mt ngoi l (exception) trong chng trình Java là du hiu ch ra rng có s xut hin mt u kin không bình thng nào ó. Khi mt ngoi l xy ra, i tng tng ng vi ngoi ló c to ra. i tng này sau ó c truyn cho phng thc là ni mà ngoi l xy ra. i tng này cha thông tin chi tit v ngoi l. Thông tin này có thc nhn v và c x lý. Các ngoi l này có th là mt ngoi l chun ca Java hoc có th là mt ngoi l do ta to ra. Lp ‘Throwable’ c Java cung cp là cha ca tt c các ngoi l trong Java (lp u tiên trong cây tha k). Sau khi bn ã bit cách khai báo và ném ra bit l, thì phn vic quan trng nht là bt và x lý bit l. Vn i vi ngi lp trình java là phi bit c n mã nào ca anh ta có th gây ra li. Khi hã khoanh vùng c n mã có th gây ra li h st n mã, có kh nng gây ra li ó trong khi try ( th làm), và t n mã x lý li trong khi catch ( bt gi). Khuôn dng tng quát nh sau: try{ // Các lnh có kh nng gây li } catch ( TypeException1 ex){ // Mã c thc thi khi mt ngoi l TypeException1 c phát sinh trong khi try } catch ( TypeException2 ex){ // Mã c thc thi khi mt ngoi l TypeException2 c phát sinh trong khi try } . catch ( TypeExceptionN ex){ // Mã c thc thi khi mt ngoi l TypeExceptionN c phát sinh trong khi try } finally{ // khi lnh nay luôn c thc hin cho dù ngoi l có xy ra trong khi try hay không. } Trang 94 Nu không có mt ngoi l nào phát sinh trong khi try thì các mnh catch s b b qua, trong trng hp mt trong các câu lnh bên trong khi try gây ra mt ngoi l thì, thì java s b qua các câu lnh còn li trong khi try i tìm mã x lý ngoi l, nu kiu ngoi l so khp vi kiu ngoi l trong mnh catch, thì mã lnh trong khi catch ó s c thc thi, nu không tìm thy mt kiu ngi l nào c so khp java s kt thúc phng thc ó và chuyn bit ló ra phng thc ã gi phng thc này quá trình này c tip tc cho n khi tìm thy mã x lý bit l, nu không tìm thy mã x lý bit l trong chui các phng thc gi nhau, chng trình có th chm dt và in thông báo li ra lung li chun System.err Ví d: Thc hin khi try Tìm khi x lý li (khi catch) thc hin u ngoi l sinh ra trong khi try là mt th hin ca lp ngoi l Thc hin khi catch ng vi ngoi l 1 u ngoi l sinh ra trong khi try là mt th hin ca lp ngoi l Thc hin khi catch ng vi ngoi l 2 false true true false ………… u ngoi l sinh ra trong khi try là mt th hin ca lp ngoi l Thc hin khi catch ng vi ngoi l 1 true Có ngoi xy ra trong khi try yes no Thc hin khi finally Trang 95 class TryClass{ public static void main(String args[]) { int n=0; try { System.out.println(1/n); } catch(ArithmeticException ex) {System.out.println(Loi chia cho 0);} } } Khi chy chng trình này ta se thu c mt dòng in ra màn hình nh sau: Loi chia cho 0 Trong on chng trình trên khi chia mt s cho 0 s gp ngoi l ArithmeticException, bit c ngoi l này có th xy ra do vy ta bt nó và x lý trong khi catch(ArithmeticException ex), ây ex là mt i tng ca lp ArithmeticException cha các thông tin v ngoi l xy ra, ta có th ly cá thông tin v ngoi l chng hn nh ly v mô t ngoi l nh sau: System.out.println(a.getMessage()). V. Khi ‘finally’ Khi mt ngoi l xut hin, phng thc ang c thc thi có th b dng mà không c hoàn thành. Nu u này xy ra, thì các on mã phía sau (ví d nhon mã có chc nng thu hi tài nguyên, nh các lnh óng tp vit cui phng thc) s không bao gic gi. Java cung cp khi finally gii quyt vic này. Thông thng khi ‘finally’ cha các câu lnh mang tính cht dn dp nh: óng kt ni CSDL, óng tp tin,…. try{ //Các lnh có kh nng ném ra ngoi l } catch(Exception1 ex1){ … } catch(Exception2 ex2){ … } catch(Exceptionn exn){ … } finally{ //Mã lnh dn dp } Khi ‘finally’ là tu chn, không bt buc phi có. Khi này c t sau khi ‘catch’ cui cùng. Chng trình s thc thi câu lnh u tiên ca khi ‘finally’ ngay sau khi gp câu lnh ‘return’ hay lnh ‘break’ trong khi ‘try’. Trang 96 Khi ‘finally’ bo m lúc nào cng c thc thi, bt chp có ngoi l xy ra hay không. Hình minh ha s thc hin ca các khi ‘try’, ‘catch’ và ‘finally’. try block catch blockfinally block finally block No Exception Exception occurs VI. Mt s lp ngoi l chun ca Java Danh sách mt s lp ngoi l Tên lp ngoi l Ý ngha Throwable ây là lp cha ca mi lp ngoi l trong Java Exception ây là lp con trc tip ca lp Throwable, nó mô t mt ngoi l tng quát có th xy ra trong ng dng RuntimeException Lp c s cho nhiu ngoi l java.lang ArthmeticException Li v s hc, ví d nh ‘chia cho 0’. IllegalAccessException Lp không th truy cp. IllegalArgumentException i s không hp l. ArrayIndexOutOfBoundsExeption Li truy cp ra ngoài mng. NullPointerException Khi truy cp i tng null. SecurityException ch bo mt không cho phép thc hin. ClassNotFoundException Không th np lp yêu cu. NumberFormatException Vic chuyn i t chui sang s không thành công. AWTException Ngoi l v AWT IOException Lp cha ca các lp ngoi l I/O FileNotFoundException Không thnh v tp tin EOFException Kt thúc mt tp tin. NoSuchMethodException Phng thc yêu cu không tn ti. InterruptedException Khi mt lung b ngt. . hành java bt u tin trình tìm mã x lý li. Mã x lý li hay còn gi là mã x lý bit l, java runtime s tìm mã x lý li bng cách ln ngc tr li chui. bng cách m rng lp Throwable I. Mc ích ca vic x lý ngoi l Mt chng trình nên có c ch x lý ngoi l thích hp. Nu không, chng trình s b