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.