Chương 7
X LÝ NGOI L (Exception Handling)
Sau khi kết thúc chương này, bn có th nm được các ni dung sau:
Định nghĩa mt ngoi l (Exception)
Hiu được mc đích ca vic x lý ngoi l
Hiu được các kiu ngoi l khác nhau trong Java
Mô t mô hình x lý ngoi l
Hiu được các khi lnh cha nhiu khi x lý ngoi l (catch)
Mô t cách s dng các khi ‘try’, ‘catch’ và ‘finally’
Gii thích cách s dng các t khoá ‘throw’ và ‘throws’
T to ra các ngoi l
7.1 Gii thiu
Exception là mt loi li đặc bit. Li này xut hin vào lúc thc thi chương trình. Các
trng thái không bình thường xy ra trong khi thi hành chương trình to ra các exception.
Nhng trng thái này không được biết trước trong khi ta đang xây dng chương trình.
Nếu bn không x lý các trng thái này thì chương trình có th b kết thúc đột ngt. Ví
d, vic chia cho 0 s to mt li trong chương trình. Ngôn ng Java cung cp cơ chế
dùng để x lý ngoi l rt hiu qu. Vic x lý này làm hn chế ti đa trường hp h
thng b hng (crash) hay h thng b ngt đột ngt. Tính năng này làm cho Java tr
thành mt ngôn ng lp trình mnh.
7.2 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.
Ch ng 7: X lý ngo i l (Exception Handling)ươ 175
7.3 X lý ngoi l
Khi mt ngoi l xy ra, đối tượng (object) 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 và được x lý. Các
môi trường runtime như ‘IllegalAccessException’, ‘EmptyStackException’ v.v… có th to
ra ngoi l. Chương trình đôi khi có th t to ra ngoi l. Lp ‘Throwable’ được Java
cung cp là lp trên cùng ca lp Exception (lp đầu tiên trong cây tha kế), lp này là
lp cha ca tt c các ngoi l khác.
7.4 Mô hình x lý ngoi l
Trong Java, mô hình x lý ngoi l giám sát vic thc thi mã để phát hin ngoi l. Mô
hình x lý ngoi l ca Java được gi là ‘catch and throw’. Trong mô hình này, khi mt
ngoi l xy ra, ngoi l s b chn và chương trình chuyn đến mt khi x lý ngoi l.
Người lp trình phi x lý các ngoi l khác nhau có th phát sinh trong chương trình.
Các ngoi l phi được x lý, hoc thoát khi chương trình khi nó xy ra.
Ngôn ng Java cung cp 5 t khoá sau để x lý các ngoi l:
try
catch
throw
throws
finally
Dưới đây là cu trúc ca mô hình x lý ngoi l:
try
{
// đon mã có kh năng gây ra ngoi l
}
catch(Exception e1)
{
// Nếu các lnh trong khi ‘try’ to ra ngoi l có loi e1, thì thc hin //x lý ngoi l
nếu không chuyn xung khi 'catch' tiếp theo
}
catch(Exception e2)
176 Core Java
{
// Nếu các lnh trong khi ‘try’ to ra ngoi l có loi e2, thì thc hin //x lý ngoi l
nếu không chuyn xung khi 'catch' tiếp theo
}
catch(Exception eN)
{
// Nếu các lnh trong khi ‘try’ to ra ngoi l có loi eN, thì thc hin //x lý ngoi l
nếu không chuyn xung khi 'catch' tiếp theo
}
finally
{
// khi lnh nay luôn được thc hin cho dù ngoi l có xy ra hay không.
}
7.4.1 Các ưu đim ca mô hình ‘catch và throw’
Mô hình ‘catch và throw’ có hai ưu đim:
Người lp trình ch phi x lý ngoi l khi cn thiết. Không cn phi thc hin ti
mi mc.
Thông báo li có th được hin ra khi tiến hành x lý ngoi l.
7.4.2 Các khi ‘try’ và ‘catch’
Khi ‘try-catch’ được s dng để thi hành mô hình ‘catch và throw’ ca vic x lý ngoi
l. Khi ‘try’ cha mt tp lnh có th thi hành được. Các ngoi l có th b chn khi thi
hành tp lnh này. Phương thc có kh năng to ra ngoi l có th được khai báo trong
khi ‘try’. Mt hay nhiu khi ‘catch’ có th theo sau mt khi ‘try’. Các khi ‘catch’ này
bt các ngoi l có kh năng to ra trong trong khi ‘try’. Hãy xem khi ‘try’ dưới đây:
try
{
doFileProcessing(); // phương thc do người s dng định nghĩa
displayResults();
}
catch (Exeption e) // th hin ca ngoi l
Ch ng 7: X lý ngo i l (Exception Handling)ươ 177
{
System.err.println(“Error :” + e.toString());
e.printStackTrace();
}
đây, ‘e’ là đối tượng ca lp ‘Exception’. Chúng ta có th s dng đối tượng này để in
các chi tiết v ngoi l. Các phương thc ‘toString’ vàprintStackTrace’ được s dng để
mô t các ngoi l xy ra. Hình sau ch ra kết xut ca phương thc ‘printStackTrace()’.
Hình 7.1 Kh i Try và Catch
Để x lý được ngoi l nào, ta phi ch ra kiu ngoi l tương ng.
catch(Exception e)
Khi ngoi l không biết thuc kiu nào, chúng ta có th s dng lp ‘Exception’ để bt
ngoi l đó.
Khi ‘catch()’ bt gi bt c các li xy ra trong khi thi hành phương thc
‘doFileProcessing’ hay ‘display’. Nếu mt li xy ra trong khi thi hành phương thc
‘doFileProcessing()’, lúc đó phương thc ‘displayResults()’ s không bao gi được gi.
Chương trình s chuyn đến thc hin khi ‘catch’. Để có nhiu lp x lý li hơn, như là
‘LookupException’ thay vì mt đối tượng ngoi l chung (Exception e), li thc tế có th
là mt đối tượng thuc lp 'LookupException’ hay mt trong s nhng lp con ca nó. Li
s được truyn qua khi ‘try catch’ cho ti khi gp ‘catch’ ca nó, nếu không tìm thy
chương trình phi dng thc hin và thoát.
7.5 Các khi cha nhiu Catch
Nhiu khi ‘catch’ x lý các loi ngoi l khác nhau mt cách độc lp. Chúng được lit kê
trong đon mã sau:
178 Core Java
try
{
doFileProcessing();
displayResults(); }
catch(LookupException e) // e – LookupException object
{
handleLookupException(e); // phương thc x lý li do người s dng
//định nghĩa
}
catch(Exception e)
{
System.err.println(“Error:” + e.printStackTrace());
}
}
Trong trường hp này, khi ‘catch’ đầu tiên s bt gi mt ‘LockupException’. Khi
‘catch’ th hai s x lý kiu ngoi l khác vi khi ‘catch’ th nht.
Mt chương trình cũng có th cha các khi ‘try’ lng nhau. Ví d đon mã dưới đây:
try
{
statement 1;
statement 2;
try
{
statement1;
statement2;
}
catch(Exception e) // ca khi try trong
{
}
}
catch(Exception e) // ca khi try ngoài
{
}
Ch ng 7: X lý ngo i l (Exception Handling)ươ 179