Tải bản đầy đủ (.pdf) (5 trang)

Xử lý ngoại lệ

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (305.22 KB, 5 trang )

Trang 92
Chng 3: X LÝ NGOI L
i vi ngi lp trình h có th gp mt trong các li sau:
- Li cú pháp (syntac error)
- Li logic thut toán
- Li lúc thc thi ( runtime error)
-i vi li cú pháp ngi lp trình có th phát hin và sa li, da vào trình biên dch,
ây là li d phát hin và sa cha, tuy nhiêmn ây cng là li gây khó khn và chán nn
i vi ngi mi hc lp trình.
-i vi li thut toán, ây là li khó phát hin và sa cha nht, tuy nhiên trong bài này
ta không bàn lun v vn  này.
-i vi li lúc thc thi, ta hoàn toàn có th kim soát c chúng, thông thng li
runtime thng do nguyên nhân khách quan nh: truy cp vào mt a nhng a này
li cha sn sàng, hay thc hin phép chia nhng mu s li bng 0, kt ni vi máy tính 
xa nhng máy ó li không tn ti…, khi mt li runtime xy ra JVM s phát sinh mt
ngoi l, nu mt chng trình không cung cp mã s lý ngoi l có th kt thúc không
bình thng, trong bài hôm nay ta s bàn v vn  s lý ngoi l trong java.
- Mi lp bit l trong java u c dn xut t lp c s Throwable, ta có th to ra lp
ngoi l riêng bng cách m rng lp Throwable
I. Mc ích ca vic x lý ngoi l
Mt chng trình nên có c ch x lý ngoi l thích hp. Nu không, chng trình s
b ngt khi mt ngoi l xy ra. Trong trng hp ó, tt c các ngun tài nguyên mà h
thng ã cp không c gii phóng. u này gây lãng phí tài nguyên.  tránh trng
hp này, tt c các ngun tài nguyên mà h thng cp nên c thu hi li. Tin trình này
òi hi c ch x lý ngoi l thích hp.
Ví d, xét thao tác vào ra (I/O) trong mt tp tin. Nu vic chuyn i kiu d liu
không thc hin úng, mt ngoi l s xy ra và chng trình b hy mà không óng tp
tin li. Lúc ó tp tin d b h hi và các ngun tài nguyên c cp phát cho tp tin
không c tr li cho h thng.
II. Mô hình s lý ngoi l ca java
Mô hình s lý ngoi l ca java da trên ba hot ng chính: c t ngoi l, ném


ra ngoi l, và bt ngoi l.
- Mi phng thc u có th phát sinh các ngoi l, các ngoi l có th phát sinh cn
c mô t chi tit trong lnh khai báo ca phng thc, vic khai báo này c gi là c
t ngoi l.
- Khi mt câu lnh trong phng thc gây li, mà ngi lp trình không cung cp mã x
lý li, thì ngoi lc chuyn n phng thc gi phng thc ó, vic này c gi là
ném ra bit l, ta có th ném ra bit l mt cách tng minh (iu này sc gii thiu
sau).
- Sau khi JVM ném ra mt ngoi l, thì h thng thi hành java bt u tin trình tìm mã x
lý li. Mã x lý li hay còn gi là mã x lý bit l, java runtime s tìm mã x lý li bng
cách ln ngc tr li chui các phng thc gi nhau, bt u t phng thc hin ti.
Chng trình s kt thúc nu không tìm thy mã x lý bit l. Quá trình tìm kim này gi
là bt bit l.
Trang 93
III. c t ngoi l
c t ngoi l là khai báo cho trình biên dch bit là phng thc này có th gây ra
ngoi l lúc thi hành.
 khai báo bit l ta s dng t khoá throws trong khai báo phng thc, ví d:
public void myMethod() throws IOException, RemoteException
t khoá throws ch cho trình biên dch java bit rng phng thc này có th ném ra ngoi
l IOException và RemoteException, nu mt phng thc ném ra nhiu ngoi l thì các
ngoi lc khai báo cách nhau bi du phy ‘,’
III. Ném ra ngoi l
Mt phng thc sau khi ã khai báo các bit l, thì bn (hoc chng trình thc thi java)
có th ném ra các i tng bit l, có kiu mà ta ã khai báo trong danh sách throws. Cú
pháp ca lnh ném ra ngoi l:
throw ExceptionObject;
Chú ý:
- Bn phi chú ý gia lnh khai báo bit l và lnh ném ra ngoi l
- Mt phng thc ch có th ném ra các ngoi l mà nó c khai báo

IV. Bt ngoi l
Mt ngoi l (exception) trong chng trình Java là du hiu ch ra rng có s xut
hin mt u kin không bình thng nào ó.
Khi mt ngoi l xy ra, i tng tng ng vi ngoi ló c to ra. i tng
này sau ó c truyn cho phng thc là ni mà ngoi l xy ra. i tng này cha
thông tin chi tit v ngoi l. Thông tin này có thc nhn v và c x lý. Các ngoi
l này có th là mt ngoi l chun ca Java hoc có th là mt ngoi l do ta to ra. Lp
‘Throwable’ c Java cung cp là cha ca tt c các ngoi l trong Java (lp u tiên
trong cây tha k).
Sau khi bn ã bit cách khai báo và ném ra bit l, thì phn vic quan trng nht là
bt và x lý bit l.
Vn i vi ngi lp trình java là phi bit c n mã nào ca anh ta có th
gây ra li. Khi hã khoanh vùng c n mã có th gây ra li h st n mã, có
kh nng gây ra li ó trong khi try ( th làm), và t n mã x lý li trong khi catch
( bt gi). Khuôn dng tng quát nh sau:
try{
// Các lnh có kh nng gây li
}
catch ( TypeException1 ex){
// Mã c thc thi khi mt ngoi l TypeException1 c phát sinh trong khi try
}
catch ( TypeException2 ex){
// Mã c thc thi khi mt ngoi l TypeException2 c phát sinh trong khi try
}
...
catch ( TypeExceptionN ex){
// Mã c thc thi khi mt ngoi l TypeExceptionN c phát sinh trong khi try
} finally{
// khi lnh nay luôn c thc hin cho dù ngoi l có xy ra trong khi try hay không.
}

Trang 94
Nu không có mt ngoi l nào phát sinh trong khi try thì các mnh  catch s b
b qua, trong trng hp mt trong các câu lnh bên trong khi try gây ra mt ngoi l thì,
thì java s b qua các câu lnh còn li trong khi try i tìm mã x lý ngoi l, nu kiu
ngoi l so khp vi kiu ngoi l trong mnh  catch, thì mã lnh trong khi catch ó s
c thc thi, nu không tìm thy mt kiu ngi l nào c so khp java s kt thúc
phng thc ó và chuyn bit ló ra phng thc ã gi phng thc này quá trình này
c tip tc cho n khi tìm thy mã x lý bit l, nu không tìm thy mã x lý bit l
trong chui các phng thc gi nhau, chng trình có th chm dt và in thông báo li ra
lung li chun System.err
Ví d:
Thc hin
khi try
Tìm khi x lý li
(khi catch) 
thc hin
u ngoi l sinh ra
trong khi try là mt
th hin ca lp
ngoi l
Thc hin khi
catch ng vi
ngoi l 1
u ngoi l sinh ra
trong khi try là mt
th hin ca lp
ngoi l
Thc hin khi
catch ng vi
ngoi l 2

false
true
true
false
…………
u ngoi l sinh ra
trong khi try là mt
th hin ca lp
ngoi l
Thc hin khi
catch ng vi
ngoi l 1
true
Có ngoi xy
ra trong khi
try
yes
no
Thc hin
khi 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 chy chng trình này ta se thu c mt dòng in ra màn hình nh sau:
Loi chia cho 0
Trong on chng trình trên khi chia mt s cho 0 s gp ngoi l ArithmeticException,
bit c ngoi l này có th xy ra do vy ta bt nó và x lý trong khi
catch(ArithmeticException ex), ây ex là mt i tng ca lp ArithmeticException
cha các thông tin v ngoi l xy ra, ta có th ly cá thông tin v ngoi l chng hn nh
ly v mô t ngoi l nh sau:
System.out.println(a.getMessage()).
V. Khi ‘finally’
Khi mt ngoi l xut hin, phng thc ang c thc thi có th b dng mà không
c hoàn thành. Nu u này xy ra, thì các on mã phía sau (ví d nhon mã có
chc nng thu hi tài nguyên, nh các lnh óng tp vit  cui phng thc) s không
bao gic gi. Java cung cp khi finally gii quyt vic này. Thông thng khi
‘finally’ cha các câu lnh mang tính cht dn dp nh: óng kt ni CSDL, óng tp
tin,….
try{
//Các lnh có kh nng ném ra ngoi l
}
catch(Exception1 ex1){

}
catch(Exception2 ex2){

}
catch(Exceptionn exn){

}
finally{
//Mã lnh dn dp

}
Khi ‘finally’ là tu chn, không bt buc phi có. Khi này c t sau khi ‘catch’
cui cùng. Chng trình s thc thi câu lnh u tiên ca khi ‘finally’ ngay sau khi gp
câu lnh ‘return’ hay lnh ‘break’ trong khi ‘try’.
Trang 96
Khi ‘finally’ bo m lúc nào cng c thc thi, bt chp có ngoi l xy ra hay
không.
Hình minh ha s thc hin ca các khi ‘try’, ‘catch’ và ‘finally’.
try block
catch blockfinally block
finally block
No Exception Exception occurs
VI. Mt s lp ngoi l chun ca Java
Danh sách mt s lp ngoi l
Tên lp ngoi l Ý ngha
Throwable ây là lp cha ca mi lp ngoi l trong Java
Exception ây là lp con trc tip ca lp Throwable, nó
mô t mt ngoi l tng quát có th xy ra
trong ng dng
RuntimeException Lp c s cho nhiu ngoi l java.lang
ArthmeticException Li v s hc, ví d nh ‘chia cho 0’.
IllegalAccessException Lp không th truy cp.
IllegalArgumentException i s không hp l.
ArrayIndexOutOfBoundsExeption Li truy cp ra ngoài mng.
NullPointerException Khi truy cp i tng null.
SecurityException  ch bo mt không cho phép thc hin.
ClassNotFoundException Không th np lp yêu cu.
NumberFormatException Vic chuyn i t chui sang s không thành
công.
AWTException Ngoi l v AWT

IOException Lp cha ca các lp ngoi l I/O
FileNotFoundException Không thnh v tp tin
EOFException Kt thúc mt tp tin.
NoSuchMethodException Phng thc yêu cu không tn ti.
InterruptedException Khi mt lung b ngt.

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×