Exceptions provide a way to handle runtime errors by transferring control to exception handlers. Code placed in a try block can throw an exception using throw, which is then caught by an exception handler defined using catch. Handlers must be defined immediately after the try block and catch the matching exception type. The standard library defines common exception types like bad_alloc thrown on memory allocation failure.
Php module 1 - ttth dh khtn [khoahoclaptrinhweb.tin.vn]Tr狸nh Kim Ng但n
油
lap trinh php, hoc lap trinh php, hoc php, l畉p tr狸nh php, h畛c l畉p tr狸nh php, h畛c php, khoa hoc php tai hcm, kho叩 h畛c l畉p tr狸nh php t畉i hcm, t畛 h畛c php, tu hoc php, t畛 h畛c php c董 b畉n, tu hoc php co ban
Unit Test with test JUNIT , JUnit is a simple framework to write repeatable tests. It is an instance of the xUnit architecture for unit testing frameworks.
1. Ch動董ng 7
X畛 L NGO畉I L畛 (Exception Handling)
Sau khi k畉t th炭c ch動董ng ny, b畉n c坦 th畛 n畉m 動畛c c叩c n畛i dung sau:
畛nh ngh挑a m畛t ngo畉i l畛 (exception)
Hi畛u 動畛c m畛c 鱈ch c畛a vi畛c x畛 l箪 ngo畉i l畛
Hi畛u 動畛c c叩c ki畛u ngo畉i l畛 kh叩c nhau trong Java
M担 t畉 m担 h狸nh x畛 l箪 ngo畉i l畛
Hi畛u 動畛c c叩c kh畛i l畛nh ch畛a nhi畛u catch
M担 t畉 c叩ch s畛 d畛ng c叩c kh畛i try, catch v finally
Gi畉i th鱈ch c叩ch s畛 d畛ng c叩c t畛 kho叩 throw v throws
T畛 t畉o ra c叩c ngo畉i l畛
7.1 Gi畛i thi畛u
Exception l m畛t l畛i 畉c bi畛t. L畛i ny xu畉t hi畛n vo l炭c th畛c thi ch動董ng tr狸nh. C叩c tr畉ng
th叩i kh担ng b狸nh th動畛ng x畉y ra trong khi thi hnh ch動董ng tr狸nh t畉o ra c叩c exception.
Nh畛ng tr畉ng th叩i ny kh担ng 動畛c bi畉t tr動畛c trong khi ta ang x但y d畛ng ch動董ng tr狸nh. N畉u
b畉n kh担ng ph但n ph畛i c叩c tr畉ng th叩i ny th狸 exception c坦 th畛 b畛 k畉t th炭c 畛t ng畛t. V鱈 d畛,
vi畛c chia cho 0 s畉 t畉o m畛t l畛i trong ch動董ng tr狸nh. Ng担n ng畛 Java cung c畉p b畛 m叩y d湛ng
畛 x畛 l箪 ngo畉i l畛 r畉t tuy畛t v畛i. Vi畛c x畛 l箪 ny lm h畉n ch畉 t畛i a tr動畛ng h畛p h畛 th畛ng b畛
ph叩 v畛 (crash) hay h畛 th畛ng b畛 ng畉t 畛t ng畛t. T鱈nh nng ny lm cho Java l m畛t ng担n
ng畛 l畉p tr狸nh m畉nh.
7.2 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 exception x畉y ra. Trong tr動畛ng h畛p 坦, t畉t c畉 c叩c ngu畛n ti nguy棚n m h畛
th畛ng tr動畛c kia ph但n ph畛i s畉 動畛c di d畛i trong c湛ng tr畉ng th叩i. i畛u ny g但y l達ng ph鱈 ti
nguy棚n. 畛 tr叩nh tr動畛ng h畛p ny, t畉t c畉 c叩c ngu畛n ti nguy棚n m h畛 th畛ng ph但n ph畛i
n棚n 動畛c thu h畛i l畉i. Ti畉n tr狸nh ny 嘆i h畛i c董 ch畉 x畛 l箪 ngo畉i l畛 th鱈ch h畛p.
Cho v鱈 d畛, x辿t thao t叩c nh畉p xu畉t (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
l畉i t畉p tin. L炭c 坦 t畉p tin d畛 b畛 h動 h畉i v c叩c ngu畛n ti nguy棚n 動畛c c畉p ph叩t cho t畉p tin
kh担ng 動畛c thu h畛i l畉i cho h畛 th畛ng.
7.3 X畛 l箪 ngo畉i l畛
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 ny
sau 坦 動畛c truy畛n cho ph動董ng th畛c l n董i m ngo畉i l畛 x畉y ra. 畛i t動畛ng ny ch畛a th担ng
tin chi ti畉t v畛 ngo畉i l畛. Th担ng tin ny c坦 th畛 動畛c nh畉n v畛 v 動畛c x畛 l箪. C叩c m担i tr動畛ng
runtime nh動 IllegalAccessException, EmptyStackException v.v c坦 th畛 ch畉n 動畛c c叩c
ngo畉i l畛. o畉n m達 trong ch動董ng tr狸nh 担i khi c坦 th畛 t畉o ra c叩c ngo畉i l畛. L畛p throwable
Ch動董ng 7: X畛 l箪 ngo畉i l畛 (Exception Handling) 27
2. 動畛c Java cung c畉p l l畛p tr棚n nh畉t c畛a l畛p Exception , l畛p ny l l畛p cha c畛a c叩c ngo畉i l畛
kh叩c nhau.
7.4 M担 h狸nh x畛 l箪 ngo畉i l畛
Trong Java, m担 h狸nh x畛 l箪 ngo畉i l畛 ki畛m tra vi畛c x畛 l箪 nh畛ng hi畛u 畛ng l畛 (l畛i), 動畛c bi畉t
畉n l m担 h狸nh catch v throw. Trong m担 h狸nh ny, khi m畛t l畛i x畉y ra, m畛t ngo畉i l畛 s畉 b畛
ch畉n v 動畛c 動a vo trong m畛t kh畛i. Ng動畛i l畉p tr狸nh vi棚n n棚n x辿t c叩c tr畉ng th叩i ngo畉i l畛
畛c l畉p nhau t畛 vi畛c i畛u khi畛n th担ng th動畛ng trong ch動董ng tr狸nh. C叩c ngo畉i l畛 ph畉i 動畛c
b畉t gi畛 n畉u kh担ng ch動董ng tr狸nh s畉 b畛 ng畉t.
Ng担n ng畛 Java cung c畉p 5 t畛 kho叩 sau 畛 x畛 l箪 c叩c ngo畉i l畛:
try
catch
throw
throws
finally
D動畛i 但y l c畉u tr炭c c畛a m担 h狸nh x畛 l箪 ngo畉i 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
}
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 i畛m c畛a m担 h狸nh catch v throw
28 Core Java
3. M担 h狸nh catch v throw c坦 hai 動u i畛m:
Ng動畛i l畉p tr狸nh vi棚n ph畉i ph但n ph畛i tr畉ng th叩i l畛i ch畛 vo nh畛ng n董i c畉n thi畉t. Kh担ng
c畉n ph畉i th畛c hi畛n t畉i m畛i m畛c.
M畛t th担ng b叩o l畛i c坦 th畛 動畛c in ra khi ti畉n hnh x畛 l箪 ngo畉i l畛.
7.4.2 C叩c kh畛i try v catch
Kh畛i try-catch 動畛c s畛 d畛ng 畛 thi hnh m担 h狸nh catch v throw c畛a vi畛c x畛 l箪 ngo畉i l畛.
Kh畛i try ch畛a m畛t b畛 c叩c l畛nh c坦 th畛 thi hnh 動畛c. C叩c ngo畉i l畛 c坦 th畛 b畛 ch畉n khi thi
hnh nh畛ng c但u l畛nh ny. Ph動董ng th畛c d湛ng 畛 ch畉n ngo畉i l畛 c坦 th畛 動畛c khai b叩o trong
kh畛i try. M畛t hay nhi畛u kh畛i catch c坦 th畛 theo sau kh畛i try. C叩c kh畛i catch ny b畉t
c叩c ngo畉i l畛 b畛 ch畉n trong kh畛i try. H達y nh狸n kh畛i 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 c畛a l畛p Exception. Ch炭ng ta c坦 th畛 s畛 d畛ng 畛i t動畛ng ny 畛 in
c叩c chi ti畉t v畛 ngo畉i l畛. C叩c ph動董ng th畛c toString v printStackTrace 動畛c s畛 d畛ng 畛
m担 t畉 c叩c exception ph叩t sinh ra. H狸nh sau ch畛 ra k畉t xu畉t c畛a ph動董ng th畛c
printStackTrace().
H狸nh 7.1 Kh畛i Try v Catch
畛 b畉t gi畛 b畉t c畛 ngo畉i l畛 no, ta ph畉i ch畛 ra ki畛u ngo畉i l畛 l Exception.
catch(Exception e)
Khi ngo畉i l畛 b畛 b畉t gi畛 kh担ng bi畉t thu畛c ki畛u no, ch炭ng ta c坦 th畛 s畛 d畛ng l畛p Exception
畛 b畉t ngo畉i l畛 坦.
Ch動董ng 7: X畛 l箪 ngo畉i l畛 (Exception Handling) 29
4. Kh畛i catch() b畉t gi畛 b畉t c畛 c叩c l畛i x畉y ra trong khi thi hnh ph動董ng th畛c
doFileProcessing hay display. N畉u m畛t l畛i x畉y ra trong khi thi hnh ph動董ng th畛c
doFileProcessing(), l炭c 坦 ph動董ng th畛c displayResults() s畉 kh担ng bao gi畛 動畛c g畛i. S畛
thi hnh s畉 ti畉p t畛c th畛c hi畛n kh畛i catch. 畛 c坦 nhi畛u l畛p x畛 l箪 l畛i h董n, nh動 l
LookupException thay v狸 m畛t 畛i t動畛ng ngo畉i l畛 chung (Exception e), l畛i th畉t s畛 s畉 l
m畛t instance c畛a LookupException hay m畛t trong s畛 nh畛ng l畛p con c畛a n坦. L畛i s畉 動畛c
truy畛n qua kh畛i try catch cho t畛i khi ch炭ng b畉t g畉p m畛t catch tham chi畉u t畛i n坦 hay
ton b畛 ch動董ng tr狸nh ph畉i b畛 hu畛 b畛.
7.5 C叩c kh畛i ch畛a nhi畛u Catch
C叩c kh畛i ch畛a nhi畛u catch x畛 l箪 c叩c ki畛u ngo畉i l畛 kh叩c nhau m畛t c叩ch 畛c l畉p. Ch炭ng
動畛c li畛t k棚 trong o畉n m達 sau:
try
{
doFileProcessing(); // user defined mothod
displayResults(); // user defined method
}
catch(LookupException e) // e Lookupexception object
{
handleLookupException(e); // user defined handler
}
catch(Exception e)
{
System.err.println(Error: + e.printStackTrace());
}
}
Trong tr動畛ng h畛p ny, kh畛i catch 畉u ti棚n s畉 b畉t gi畛 m畛t LockupException. Kh畛i catch
th畛 hai s畉 x畛 l箪 ki畛u ngo畉i l畛 kh叩c v畛i kh畛i catch th畛 nh畉t.
M畛t ch動董ng tr狸nh c滴ng c坦 th畛 ch畛a c叩c kh畛i try l畛ng nhau. V鱈 d畛 o畉n m達 d動畛i 但y:
try
{
statement 1;
statement 2;
try
{
statement1;
statement2;
}
catch(Exception e) // of the inner try block
{
}
30 Core Java
5. }
catch(Exception e) // of the outer try block
{
}
Khi s畛 d畛ng c叩c try l畛ng nhau, kh畛i try b棚n trong 動畛c thi hnh 畉u ti棚n. B畉t k畛 ngo畉i
l畛 no b畛 ch畉n trong kh畛i try s畉 b畛 b畉t gi畛 trong c叩c kh畛i catch theo sau. N畉u kh畛i
catch th鱈ch h畛p kh担ng 動畛c t狸m th畉y th狸 c叩c kh畛i catch c畛a c叩c kh畛i try b棚n ngoi s畉
動畛c xem x辿t. N畉u kh担ng, Java Runtime Environment x畛 l箪 c叩c ngo畉i l畛.
ch動董ng tr狸nh 7.1 minh h畛a c叩ch s畛 d畛ng c叩c kh畛i try v catch.
Ch動董ng tr狸nh 7.1
class TryClass
{
public static void main(String args[])
{
int demo=0;
try
{
System.out.println(20/demo);
}
catch(ArithmeticException a)
{
System.out.println(Cannot Divide by zero);
}
}
}
K畉t xu畉t c畛a ch動董ng tr狸nh:
H狸nh 7.2 ArithmeticException
Trong ch動董ng tr狸nh ny, m畛t s畛 動畛c chia cho 0. 但y kh担ng l to叩n t畛 s畛 h畛c h畛p l畛. Do
坦 m畛t ngo畉i l畛 b畛 ch畉n v 動畛c b畉t gi畛 trong kh畛i catch. Khi ng動畛i l畉p tr狸nh vi棚n nh畉n
bi畉t 動畛c lo畉i ngo畉i l畛 no c坦 th畛 x畉y ra, anh ta hay c担 ta vi畉t m畛t c但u l畛nh trong kh畛i
catch. 畛 但y, a 動畛c s畛 d畛ng nh動 m畛t 畛i t動畛ng c畛a Arithmaticexception 畛 in c叩c chi
Ch動董ng 7: X畛 l箪 ngo畉i l畛 (Exception Handling) 31
6. ti畉t v畛 c叩c to叩n t畛 ngo畉i l畛 m h畛 th畛ng cung c畉p. N畉u b畉n thay th畉 l畛nh
System.out.println c畛a kh畛i catch b畉ng l畛nh System.out.println(a.getMessage())
th狸 k畉t xu畉t c畛a ch動董ng tr狸nh nh動 sau:
H狸nh 7.3 C但u th担ng b叩o l畛i
Khi c叩c kh畛i try 動畛c s畛 d畛ng m kh担ng c坦 c叩c kh畛i catch no, ch動董ng tr狸nh s畉 bi棚n
d畛ch m kh担ng g畉p s畛 c畛 no nh動ng s畉 b畛 ng畉t khi th畛c thi. B畛i v狸 ngo畉i l畛 達 x畉y ra khi
th畛c thi ch動董ng tr狸nh.
7.6 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 thi hnh ton v畉n. N畉u i畛u ny x畉y ra, th狸 c叩c o畉n m達 (v鱈 d畛 nh動 o畉n m達 v畛i
ch畛c nng thu h畛i ti nguy棚n c坦 c叩c l畛nh 坦ng l畉i t畉p tin khai b叩o 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 ny. Kh畛i finally
th畛c hi畛n t畉t c畉 c叩c vi畛c thu d畛n khi m畛t ngo畉i l畛 x畉y ra. Kh畛i ny c坦 th畛 動畛c s畛 d畛ng
k畉t h畛p v畛i kh畛i try. Kh畛i finally ch畛a c叩c c但u l畛nh thu h畛i ti nguy棚n v畛 cho h畛 th畛ng
hay l畛nh in ra c叩c c但u th担ng b叩o. C叩c l畛nh ny bao g畛m:
坦ng t畉p tin.
坦ng l畉i b畛 k畉t qu畉 (動畛c s畛 d畛ng trong ch動董ng tr狸nh c董 s畛 d畛 li畛u).
坦ng l畉i c叩c k畉t n畛i 動畛c t畉o trong c董 s畛 d畛 li畛u.
try
{
doSomethingThatMightThrowAnException();
}
finally
{
cleanup();
}
Ph動董ng th畛c cleanup() 動畛c g畛i n畉u ph動董ng th畛c
doSomethingThatMightThrowAnException() ch畉n m畛t ngo畉i l畛. M畉t kh叩c cleanup() c滴ng
動畛c g畛i ngay khi kh担ng c坦 ngo畉i l畛 no b畛 ch畉n v thi hnh ti畉p t畛c sau kh畛i l畛nh finally.
Kh畛i finally l tu畛 箪, kh担ng b畉t bu畛c. Kh畛i ny 動畛c 畉t sau kh畛i catch. H畛 th畛ng s畉
duy畛t t畛 c但u l畛nh 畉u ti棚n c畛a kh畛i finally sau khi g畉p c但u l畛nh return hay l畛nh break
32 Core Java
7. 動畛c d湛ng trong kh畛i try.
Kh畛i finally b畉o 畉m l炭c no c滴ng 動畛c th畛c thi, b畉t ch畉p c坦 ngo畉i l畛 x畉y ra hay kh担ng.
H狸nh 7.4 minh h畛a s畛 thi hnh c畛a c叩c kh畛i try, catch v finally.
try block
catch blockfinally block
finally block
No Exception Exception occurs
H狸nh 7.4 Kh畛i l畛nh try, catch v finally
H狸nh 7.2 s畛 d畛ng kh畛i finally. 畛 但y, kh畛i finally 動畛c thi hnh b畉t ch畉p
ArithmeticException c坦 x畉y ra hay kh担ng. Kh畛i ny khai b叩o c叩c ho畉t 畛ng thu d畛n.
Ch動董ng tr狸nh 7.2
class FinallyDemo
{
String name;
int no1,no2;
FinallyDemo(String args[])
{
try
{
name=new String(Aptech Limited);
no1=Integer.parseInt(args[0]);
no2=Integer.parseInt(args[1]);
System.out.println(name);
System.out.println(Division Result is + no1/no2);
}
catch(ArithmeticException i)
{
System.out.println(Cannot Divide by zero);
}
finally
{
name=null; // clean up code
System.out.println(Finally executed);
}
}
public static void main(String args[])
Ch動董ng 7: X畛 l箪 ngo畉i l畛 (Exception Handling) 33