You are on page 1of 33

X l ngoi l

X l li v ngoi l
Khi try/catch/finally
Cc lp ngoi l
Xy dng lp ngoi l
Lan truyn ngoi l
Tung li ngoi l
Bi tp

X l li v ngoi l
Trong mt s ngn ng nh C, vic x l li
thng c ci t ngay ti cc bc thc
hin ca chng trnh. Cc hm s tr v mt
cu trc li khi gp li.
V d: Tm kim phn t trong mt danh sch

ErrorStruct error = new ErrorStruct();


TableEntry entry = lookup(Marianna, employee, error);
if (entry == null)
{
return error;
}
2

X l li v ngoi l
M lnh v m x l li nm xen k khin
lp trnh vin kh theo di c thut ton
chnh ca chng trnh.
Khi mt li xy ra ti hm A, tt c cc li
gi hm lng nhau n A u phi x l li
m A tr v.

X l li v ngoi l
Trong Java, vic x l li c th c ci t
trong mt nhnh c lp vi nhnh chnh ca
chng trnh.
Li c coi nh nhng trng hp ngoi l
(exceptional conditions). Chng c
bt/nm (catch and throw) khi c li xy ra.
=> Mt trng hp li s ch c x l ti
ni cn x l.
=> M chnh ca chng trnh sng sa,
ng vi thit k thut ton.
4

V d 1
import java.awt.Point;
public class MyArray
{
public static void main(String[ ] args) {
System.out.println("Goi phuong thuc methodeX()");
methodeX();
System.out.println("Chuong trinh ket thuc binh thuong");
}
public static void methodeX() {
Point[ ] pts = new Point[10];
for(int i = 0; i < pts.length; i++) {
pts[i].x = i;
pts[i].y = i+1;
}
}
}
5

Kt qu thc thi v d 1
Goi phuong thuc methodeX()
Exception in thread "main" java.lang.NullPointerException
at MyArray.methodeX(MyArray.java:14)
at MyArray.main(MyArray.java:7)

Gii thch: H thng tung ra mt exception thuc lp


NullPointerException khi gp li. Sau chng trnh kt
thc.

V d 2
public class MyDivision {
public static void main(String[ ] args) {
System.out.println("Goi phuong thuc A()");
A();
System.out.println("Chuong trinh ket thuc binh thuong");
}
public static void A() {
B();
}
public static void B() {
C();
}
public static void C() {
float a = 2/0;
}
}
7

Kt qu thc thi v d 2
Goi phuong thuc A()
Exception in thread "main" java.lang.ArithmeticException: / by zero

at
at
at
at

MyDivision.C(MyDivision.java:14)
MyDivision.B(MyDivision.java:11)
MyDivision.A(MyDivision.java:8)
MyDivision.main(MyDivision.java:4)

Gii thch: Phng thc A() gi B(), B() gi C(), C() gy ra li


chia cho 0 v h thng nm ra mt exception thuc lp
ArithmeticException. Sau chng trnh kt thc.

Ngoi l
Khi mt phng thc gp li no ,
v d nh chia khng, vt kch thc
mng, m file cha tn ti th cc
ngoi l s c nm ra. Chng trnh
dng li ngay lp tc, ton b phn
m pha sau s khng c thc thi.
Java h tr cch thc x l ngoi l
(exception handling) tu theo nhu cu
ca chng trnh.
9

X l ngoi l
Khi try/catch
t on m c kh nng xy ra ngoi l
trong khi try
t on m x l ngoi l trong khi
catch
Khi xy ra ngoi l trong khi try, cc cu
lnh trong khi catch s c thc hin
tu vo kiu ca ngoi l.
Sau khi thc hin xong khi catch, iu
khin s c tr li cho chng trnh.
10

Khi try/catch
V d 1:
try
{

methodeX();
System.out.println(Cau lenh ngay sau methodX());

}
catch (NullPointerException e)
{
System.out.println(Co loi trong khoi try);
}
System.out.println(Cau lenh sau try/catch);

11

Khi try/catch
V d 2:
try {

A();
} catch (Exception e) {
System.out.println(Co loi trong A());
}

V d 3:
try {

x = System.in.read();
System.out.println(x = + x);
} catch (IOException e) {
System.out.println(Error: + e.getMessage());
}
12

Khi try/catch
V d 4:
try
{

String s = buff.readLine();
int a = Integer.parseInt(s);
x[i++] = a;
} catch (IOException e) {
System.out.println(Error IO: + e.getMessage());
} catch (NumberFormatException e) {
System.out.println(Error Format: + e.getMessage());
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println(Error Index: + e.getMessage());
}

13

Khi finally
Khi mt ngoi l xy ra, chng trnh dng
li, mt s cng vic dn dp c th s
khng c thc hin (v d nh ng file).
Khi finally m bo rng cc cu lnh trong
lun c thc hin, k c khi ngoi l
xy ra.
try
{
doSomething(); // phng thc ny c th gy ra ngoi l
} finally {
cleanup();
}

14

Tm tt v x l ngoi l
Cc ngoi l xy ra khi gp li.
C th bt v x l cc ngoi l bng cch s
dng khi try/catch. Nu khng chng trnh
s kt thc ngay (vi ng dng console)
hoc tip tc tn ti (vi ng dng GUI).
Khi bt ngoi l, phi bit r kiu ngoi l
cn bt. C th dng kiu cha Exception.
chc chn vic dn dp lun c thc
hin, dng khi finally. C th kt hp
try/catch/finally.
15

Mt s lp ngoi l
Object
Throwable
Error

Exception

AssertionError RuntimeException IOException ClassNotFoundException


NullPointerException

ArithmeticException

16

Mt s lp ngoi l
Lp Throwable
C mt bin String lu thng tin chi tit
v ngoi l xy ra
Mt s phng thc c bn
Throwable(String s); // To mt ngoi l c
tn l s.
String getMessage(); // Ly thng tin v
ngoi l
void printStackTrace(); // In ra tt c cc
thng tin lin quan n ngoi l
17

Mt s lp ngoi l
Lp Exception
C nhiu ngoi l thuc lp con ca
Exception.
Ngi dng c th to ra cc ngoi l k
tha t Exception.

Lp Error
Ch nhng li nghim trng v khng d
on trc c nh ThreadDead,
LinkageError, VirtualMachineError...
Cc ngoi l kiu Error t c x l.
18

Mt s lp ngoi l
RuntimeException: Ch cc ngoi l c
th xy ra khi JVM thc thi chng trnh
NullPointException: con tr null
OutOfMemoryException: ht b nh
ArithmeticException: li ton hc, li chia
khng
ClassCastException: li p kiu
ArrayIndexOutOfBoundsException: vt
qu ch s mng
...
19

Hai loi ngoi l


Ngoi l unchecked
L cc ngoi l khng bt buc phi c
kim tra.
Gm RuntimeException, Error v cc lp
con ca chng.

Ngoi l checked
L cc ngoi l bt buc phi c kim
tra.
Gm cc ngoi l cn li.
20

Ch vi ngoi l checked
Gi s method1 gi method2 v
method2 l phng thc c kh nng
nm ngoi l kiu checked, lc :
hoc method2 phi nm trong khi
try/catch.
hoc phi khai bo method1 c kh nng
nm (throws) ngoi l.

21

V d: Ngoi l IOException
Cch 1: try/catch
public static void main(String[] args)
{

try {

String s = buff.readLine();

} catch (IOException e) {

...

}
}

Cch 2: Khai bo throws


public static void main(String[] args) throws IOException
{

String s = buff.readLine();
}
22

Bi tp ti lp
Bi 1: Ci t x l cc ngoi l cho
chng trnh tnh thng 2 s bng
giao din GUI.
Bi 2: Ci t x l li bng cch dng
ngoi l cho v d phn u bi.

23

Ngoi l do ngi dng to


nh ngha lp ngoi l
// file MyException.java

public class MyException extends Exception


{
public MyException(String msg)
{
super(msg);
}
}

24

Ngoi l do ngi dng to


S dng ngoi l

Khai bo kh nng tung ngoi l

// file ExampleException.java
public class ExampleException
{
public void copy(String fileName1, String fileName2)
throws MyException
{
if (fileName1.equals(fileName2))
throw new MyException("File trung ten"); // tung ngoi l
}

System.out.println("Copy completed");

Tung ngoi l
25

Ngoi l do ngi dng to


S dng ngoi l

public static void main(String[] args)


{
ExampleException obj = new ExampleException();
try {
String a = args[0];
String b = args[1];
obj.copy(a,b);
} catch (MyException e) {
System.out.println(e.getMessage());
}
}

26

Lan truyn ngoi l


Tnh hung
Gi s trong main() gi phng thc A(),
trong A() gi B(), trong B() gi C(). Khi
mt ngn xp cc phng thc c
to ra.
Gi s trong C() xy ra ngoi l.

27

Lan truyn ngoi l


C()

C() tung ngoi l

B()

B()

A()

A()

main()

main()

Nu C() gp li v tung ra ngoi l nhng trong C() li khng x l


ngoi l ny, th ch cn mt ni c th x l chnh l ni m C() c
gi, l trong phng thc B(). Nu trong B() cng khng x l th
phi x l ngoi l ny trong A()Qu trnh ny gi l lan truyn
ngoi l.
Nu n main() cng khng x l ngoi l c tung t C() th
chng trnh s phi dng li.
28

Nm li ngoi l
Trong khi catch, ta c th khng x l
trc tip ngoi l m li nm li ngoi l
cho ni khc x l.
catch (IOException e) {
throw e;

Ch : Trong trng hp trn, phng


thc cha catch phi bt ngoi l hoc
khai bo throws cho ngoi l (nu l loi
checked).
29

Ch khi s dng ngoi l


Khng nn s dng ngoi l thay cho cc
lung iu khin trong chng trnh.
V d: Kim tra delta trong chng trnh gii
phng trnh bc 2.

Nn thit k v s dng ngoi l mt


cch thng nht cho ton b d n.
Mt s x l li bng ngoi l ph bin
l: ht b nh, vt qu ch s mng,
con tr null, chia cho 0, i s khng hp
l...
30

Bi tp
1. Vit chng trnh cho php tnh gi tr ca
biu thc:
5x - y

A=

2x + 7y

Yu cu x l cc ngoi l c th xy ra.
2. Vit chng trnh cho php to mt mng 2
chiu c mxn vi m,n nhp t bn phm. Ci
t cc x l ngoi l cn thit.

31

Bi tp
3. Xy dng lp ngoi l DateException cho
cc li v ngy thng.
4. Vit chng trnh cho php ngi dng nhp
vo ngy, thng nm, nu thng tin ny
khng hp l s tung ra mt ngoi l
DateException, sau thng bo cho ngi
nhp bit v cho php ngi dng nhp li.

32

Bi tp
5. Tm hiu li lp Candidate hc (d liu
gm m th sinh, tn v im thi 3 mn).
iu g s xy ra khi to mt i tng
thuc lp Candidate vi d liu a vo
khng hp l ? Ci t lp
CandidateException bt cc li nh trn.
Yu cu khi c li th s cho bit c tn v
m th sinh b li.

33

You might also like