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 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 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 phân phi các trng thái này thì
exception 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 b máy dùng để x lý ngoi l rt tuyt vi. Vic x lý này làm hn chế ti đa trường hp
h thng b phá v (crash) hay h thng b ngt đột ngt. Tính năng này làm cho Java là 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
exception xy ra. Trong trường hp đó, tt c các ngun tài nguyên mà h thng trước kia phân phi s
được di di trong cùng trng thái. Đ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 phân phi nên được thu hi li. Tiến trình này đòi hi cơ chế x lý ngoi
l thích hp.
Cho ví d, xét thao tác nhp xut (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 li tp tin. 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 thu hi li cho h thng.
7.3 X lý ngoi l
Ch ng 7: X lý ngo i l (Exception Handling)ươ 27
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 và được x lý. Các môi trường runtime như ‘IllegalAccessException’,
‘EmptyStackException’ v.v… có th chn được các ngoi l. Đon mã trong chương trình đôi khi có th
to ra các ngoi l. Lp ‘throwable’ được Java cung cp là lp trên nht ca lp Exception , lp này là
lp cha ca các ngoi l khác nhau.
7.4 Mô hình x lý ngoi l
Trong Java, mô hình x lý ngoi l kim tra vic x lý nhng hiu ng l (li), được biết đến là mô hình
‘catch và throw’. Trong mô hình này, khi mt li xy ra, mt ngoi l s b chn và được đưa vào trong
mt khi. Người lp trình viên nên xét các trng thái ngoi l độc lp nhau t vic điu khin thông
thường trong chương trình. Các ngoi l phi được bt gi nếu không chương trình s b ngt.
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
{
// place code that is expected to throw an exception
}
catch(Exception e1)
{
// If an exception is thrown in ‘try’, which is of type e1, then perform
// necessary actions here, else go to the next catch block
}
catch(Exception e2)
{
// If an exception is thrown in, try which is of type e2, then perform
// necessary actions here, else go to the next catch block
}
28 Core Java
catch(Exception eN)
{
// If an exception is thrown in, try which is of type eN, then perform
// necessary actions here, else go to the next catch block
}
finally
{
// this book is executed, whether or not the exception is throw.
}
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 viên phi phân phi trng thái li ch vào nhng nơi cn thiết. Không cn phi
thc hin ti mi mc.
Mt thông báo li có th được in 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 b các lnh có th thi hành được. Các ngoi l có th b chn khi thi hành nhng câu lnh
này. Phương thc dùng để chn ngoi l có th được khai báo trong khi ‘try’. Mt hay nhiu khi
‘catch’ có th theo sau khi ‘try’. Các khi ‘catch’ này bt các ngoi l b chn trong khi ‘try’. Hãy nhìn
khi ‘try’ dưới đây:
try
{
doFileProcessing(); // user-defined method
displayResults();
}
catch (Exception e) // exception object
{
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
Ch ng 7: X lý ngo i l (Exception Handling)ươ 29
ngoi l. Các phương thc toString’ và ‘printStackTrace’ được s dng để mô t các exception phát
sinh ra. Hình sau ch ra kết xut ca phương thc ‘printStackTrace()’.
Hình 7.1 Kh i Try và Catch
Để bt gi bt c ngoi l nào, ta phi ch ra kiu ngoi l là ‘Exception’.
catch(Exception e)
Khi ngoi l b bt gi 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. S thi hành s tiếp tc 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 tht
s s là mt instance ca ‘LookupException’ hay mt trong s nhng lp con ca nó. Li s được
truyn qua khi ‘try catch’ cho ti khi chúng bt gp mt ‘catch’ tham chiếu ti nó hay toàn b chương
trình phi b hu b.
7.5 Các khi cha nhiu Catch
Các khi cha nhiu ‘catch’ x lý các kiu ngoi l khác nhau mt cách độc lp. Chúng được lit kê
trong đon mã sau:
try
{
doFileProcessing(); // user defined mothod
displayResults(); // user defined method
}
catch(LookupException e) // e – Lookupexception object
{
30 Core Java
handleLookupException(e); // user defined handler
}
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) // of the inner try block
{
}
}
catch(Exception e) // of the outer try block
{
}
Khi s dng các ‘try’ lng nhau, khi ‘try’ bên trong được thi hành đầu tiên. Bt k ngoi l nào b chn
trong khi ‘try’ s b bt gi trong các khi ‘catch’ theo sau. Nếu khi ‘catch’ thích hp không được tìm
thy thì các khi ‘catch’ ca các khi ‘try’ bên ngoài s được xem xét. Nếu không, Java Runtime
Environment x lý các ngoi l.
chương trình 7.1 minh ha cách s dng các khi ‘try’ và ‘catch’.
Ch ng 7: X lý ngo i l (Exception Handling)ươ 31