Chương 3
X LÝ NGOI L
Đối vi người lp trình h có th gp mt trong các li sau:
1 Li cú pháp (syntac error)
2 Li logic thut toán
3 Li lúc thc thi ( runtime error)
- Đối vi li cú pháp người 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 cũng là li gây khó khăn
và chán nn đối vi người 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 thường
li runtime thường do nguyên nhân khách quan như: truy cp vào mt đĩa nhưng
đĩa này li chưa sn sàng, hay thc hin phép chia nhưng mu s li bng 0, kết
ni vi máy tính xa nhưng máy đó li không tn ti…, khi mt li runtime xy
ra JVM s phát sinh mt ngoi l, nếu mt chương trình không cung cp mã s
ngoi l có th kết thúc không bình thường, 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 chương trình nên có cơ chế x lý ngoi l thích hp. Nếu không, chương
trình s b ngt khi mt ngoi l xy ra. Trong trường hp đó, tt c các ngun tài
nguyên mà h thng đã cp không được gii phóng. Điu này gây lãng phí tài
nguyên. Để tránh trường hp này, tt c các ngun tài nguyên mà h thng cp
nên được thu hi li. Tiến 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. Nếu vic chuyn đổi kiu d liu
không thc hin đúng, mt ngoi l s xy ra và chương 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
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 phương 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 tiết trong lnh khai báo ca phương thc, vic khai báo này
đựơc gi là đặc t ngoi l.
- Khi mt câu lnh trong phương thc gây li, mà người lp trình không cung cp
mã x lý li, thì ngoi l được chuyn đến phương thc gi phương thc đó, vic
này được gi là ném ra bit l, ta có th ném ra bit l mt cách tường minh (điu
này s được gii thiếu sau).
- Sau khi JVM ném ra mt ngoi l, thì h thng thi hành java bt đầu tiến 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 ngược tr li chui các phương thc gi nhau, bt đầu
t phương thc hin ti. Chương trình s kết thúc nếu không tìm thy mã x
bit l. Quá trình tìm kiếm này gi là bt bit l.
III. Đặc t ngoi l
Đặc t ngoi l là khai báo cho trình biên dch biết là phương 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 phương thc,
ví d:
public void myMethod() throws IOException, RemoteException
t khoá throws ch cho trình biên dch java biết rng phương thc này có th ném
ra ngoi l IOException và RemoteException, nếu mt phương thc ném ra nhiu
ngoi l thì các ngoi l được khai báo cách nhau bi du phy ‘,’
III. Ném ra ngoi l
Mt phương thc sau khi đã khai báo các bit l, thì bn (hoc chương trình thc
thi java) có th ném ra các đối tượng 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ú ý:
3 Bn phi chú ý gia lnh khai báo bit l và lnh ném ra ngoi l
4 Mt phương 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 chương trình Java là du hiu ch ra rng có
s xut hin mt điu kin không bình thường nào đó.
Khi mt ngoi l xy ra, đối tượng tương ng vi ngoi l đó được to ra. Đối
tượng này sau đó được truyn cho phương thc là nơi mà ngoi l xy ra. Đối
tượng này cha thông tin chi tiết v ngoi l. Thông tin này có th được nhn 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 đã biết 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 người lp trình java là phi biết được đon mã nào ca anh
ta có th gây ra li. Khi h đã khoanh vùng được đon mã có th gây ra li h s
đặt đon mã, có kh năng gây ra li đó trong khi try ( th làm), và đặt đon mã
x lý li trong khi catch ( bt gi). Khuôn dng tng quát như sau:
try{
// Các lnh có kh năng 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.
}
Nếu không có mt ngoi l nào phát sinh trong khi try thì các mnh đề
catch s b b qua, trong trường 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, nếu kiu ngoi l so khp vi kiu ngoi l trong mnh đề
catch, thì mã lnh trong khi catch đó s được thc thi, nếu không tìm thy mt
kiu ngi l nào được so khp java s kết thúc phương thc đó và chuyn bit l
đó ra phương thc đã gi phương thc này quá trình này được tiếp tc cho đến khi
tìm thy mã x lý bit l, nếu không tìm thy mã x lý bit l trong chui các
phương thc gi nhau, chương trình có th chm dt và in thông báo li ra lung
li chun System.err
Ví d
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 chương 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 chương trình trên khi chia mt s cho 0 s gp ngoi l
ArithmeticException, biết đượ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 tượng 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, phương thc đang được thc thi có th b dng mà