1
Bài 10. Ngoại l x
lý ngoại lệ
1
1
Mục tiêu của bài học
v !"#"$%&'(&$)*$+,-."$/0$/1$,2$)1$34$%#$(5($/6"$'(&$(78$
)"0($9:$/;$+,-."$/0$&<=+,$>?"$%<6+,
v !"#"$%&'(&$><6($34$&2+&$9:$/;$+,-."$/0$
v @:$AB+,$C&?"$%DEF(8%(&FG+8//E$>H$IJ%$)1$9:$/;$
+,-."$/0$%D-+,$K8)8
v L"HM$)1$I"N%$(5(&$O:$AB+,$7E$+&"03$+,-."$/0
v P"N%$(5(&$%.-$D8$)1$O:$AB+,$+,-."$/0$%Q$>R+&$+,&S8
2
2
Nội dung
1. Ngoại lệ
2. Bt và x ngoi l
3. y nhim ngoi l
4. Tạo ngoi l t định nghĩa
3
3
Nội dung
1. Ngoại lệ
2. Bt và x ngoi l
3. y nhim ngoi l
4. Tạo ngoi l t định nghĩa
4
4
2
1.1. Ngoại lệ là gì?
v Exception = Exceptional event
v Đnh nghĩa: Ngoi l mt s kin xy ra
trong quá trình thc thi chương trình, nó phá
vỡ lung bình thưng ca chương trình
5
ERROR !!
Ví dụ:
5
1.1. Ngoại lệ là gì? (2)
v Ngoi l mt li đc biệt
v T&"$9#E$D8$3U%$+,-."$/0V$nếu không x thì
(&<W+,$%D2+&$CN%$%&X($+,8E$)1$%D#$/."$YME*+$>"*M$
C&"H+$(&-$&0$>"*M$&1+&Z
6
6
1.2. Cách xử lý lỗi truyền thống
v Viết 3[$9:$/;$%."$+W"$\&5%$O"+&$D8$/]"
§ Làm cho chương trình trở nên rối
§ Không phải lúc nào cũng đầy đủ thông >n để xử lý
§ Không nhất thiết phải xử lý
v ^DME*+$%D.+,$%&5"$/_+$3`($%D_+
§ Thông qua tham số, giá trị trả lại hoặc biến tổng thể (flag)
§ Dễ nhầm
§ Vẫn còn khó hiu
7
7
Ví dụ
int devide(int num, int denom, int *error)
{
if (denom != 0){
error = 0;
return num/denom;
} else {
error = 1;
return 0;
}
}
8
8
3
Nhược điểm
v T&a$C"H3$O-5%$><6($&N%$(5($%D<b+,$&6\
§ Lỗi số học, lỗi bộ nhớ,…
v cd\$%D2+&$)"_+$%&<b+,$YM_+$C&4+,$9:$/;$/]"
§ Bản chất con người
§ Thiếu kinh nghiệm, cố ?nh bỏ qua
9
9
Nội dung
1. Ngoại lệ
2. Bt và xử ngoi l
3. y nhim ngoi l
4. Tạo ngoi l t định nghĩa
10
10
2.1. Mục đích của xử lý ngoại lệ
v Giúp !"#$%& '()%" *+%& ,%-!./ "$%, tránh 01' '"2! 34'
'"#5%&
v 6ách bit khi lnh có th gây ngoi l khi lnh
xử ngoi l
7777-
89-:-8;-<=>?-@?-6?-=>>?>
A-B-CD:
E>8F6-A
@?-6?-=G86
=>>?>H
I8;EJCK-LI8M8;8?F-:K-<=>?N
=G86H
=FI
Khối xử lỗi
11
2.1. Mục đích của xử lý ngoại lệ (2)
v T&"$9#E$D8$+,-."$/0V$+NM$C&4+,$(a$(W$(&N$9:$/;$%&'(&$
&6\e
§ Chương trình bị ngắt khi ngoại lệ xảy ra
§ Các tài nguyên không được giải phóng à Lãng phí
v f'$ABe$f1-FD8$%0\$g+
§ Nếu ngoại lệ xảy ra (ví dụ như chuyển đổi kiểu không đúng)
à Chương trình kết thúc mà không đóng tệp >n lại
Tệ p %n k hô ng t h tr uy c p /h n g
i nguyê n cp phát khôn g đưc gi i phón g
12
12
4
2.2. Mô hình xử lý ngoại lệ
v L<=+,$>?"$%<6+,
§ OP%&-&PQ-!+!-*QRS-0QT%-0"U%&-VW%&-*XQ-'(W%&-VY'-*ZQ-
'#X%&
§ ["Q-\]/-(^-%&W_Q-`Ta-*ZQ-'#X%&-'#$%&-b%&-cdQ-%&W_Q-`T-
*#X!-'_W-(^-!"b^-'"U%&-,%-!"Q-,1'-cR-%&W_Q-`T
§ AS%&-!4e-!$-!"1-"QTS-fS]-'(W%&-cQT!-\g-`h-`iQ-
§ 6+!"-3QT'-`Sj%&-*QRS-0"Qk%-34'-'"#5%&-cdQ-`Sj%&-3)%"-
'"#5%&
13
13
2.2. Mô hình xử lý ngoại lệ (2)
v h,-."$/0$(i+$\&#"$><6($9:$/;$j$%."$\&<W+,$%&`($
O"+&$D8$+,-."$/0$&-k($7E$+&"03$(&-$\&<W+,$%&`($
,l"$>N+
14
14
2.3. Xử lý ngoại l trong Java
v l^c^-!P !$ !"1 \g `h %&W_Q `T (4'
V_%"
v Gg `h %&W_Q `T '(W%& J^c^-*#X! '"m!
"QT% '"nW VU ")%" "#d%& *ZQ '#X%&:
§ Tất cả các ngoại lệ đều thể hiện của
một lớp kế thừa từ lớp Throwable hoặc
các lớp con của
§ Các đối tượng này nhiệm vụ chuyển
thông >n về ngoại lệ (loi và trng thái
của chương trình) từ vị trí xảy ra ngoại
lệ đến nơi quản /x .
15
15
2.3. Xử lý ngoại lệ trong Java (2)
v m5( %n C&a8
§ try
§ catch
§ finally
§ throw
§ throws
16
16
5
2.3.1. Khối try/catch
v Khối %DE ... ca%(&: Pho+ %5(& >-.+ (&<W+, %D2+&
%&4+, %&<b+, )1 \&i+ 9: /; +,-." /0
§ '(/ o7pH K"ZQ `T%" !P 0"] %q%& &r/ (^ %&W_Q `T
§ !^'!"st o7pH Bu' cv \g `h cdQ %&W_Q `T
try {
// Doan ma co the gay ngoai le
} catch (ExceptionType e) {
// Xu ly ngoai le
}
v ExceptionType `v VY' `de !W% !w^ Throwable
17
17
dụ không x lý ngoi l
class NoException {
public static void main(String args[])
{
String text = args[0];
System.out.println(text);
}
}
18
18
Ví dụ có xử ngoi l
19
class ArgExceptionDemo {
public static void main(String args[]) {
try {
String text = args[0];
System.out.println(text);
}
catch(Exception e) {
System.out.println(“Hay nhap tham so khi chay!");
}
}
}
19
Ví dụ chia cho 0
20
public class ChiaCho0Demo {
public static void main(String args[]){
try {
int num = calculate(9,0);
System.out.println(num);
}
catch(Exception e) {
System.err.println("Co loi xay ra: " + e.toString());
}
}
static int calculate(int no, int no1){
int num = no / no1;
return num;
}
}
20
6
2.3.2. Cây phân cấp ngoại lệ trong Java
21
Object
Throwable
Error Exception
RuntimeException
...
...
...
Throwable là một lp
sở, nó cung cấp
giao din và s thực
thi cho hu hết các
ngoại l.
Exception là lớp cơ sở
cho tất cả các lỗi có thể
kiểm soát được.
VD: ArithmeticException,
BufferOverflowException
Error chỉ ra các lỗi đặc
biệt nghiêm trọng, những
lỗi này chương trình
không thể quản lý được.
VD: VirtualMachineError
OutOfMemoryError
21
a. Lớp Throwable
v pU%$I"N+$C"HM$@%D"+,$>H$/<M$%&4+,$g+$(&"$gN%$)*$
+,-."$/0$>[$9#E$D8
v pU%$O?$\&<W+,$%&`($(W$I#+
§ new Throwable(String s): 6_W-VY'-%&W_Q-`T
với thông tin v ngoi l `v-x
§ String getMessage(): J4/-'"U%&-,%-cR-%&W_Q-`T
§ void printStackTrace(): 8%-(^-'4'-!]-!+!-'"U%&-
,%-`Qy%-fS^%-*1%-%&W_Q-`T-s'ên, loi, v trí...)
§ 7
22
22
public class StckExceptionDemo {
public static void main(String args[]){
try {
int num = calculate(9,0);
System.out.println(num);
}
catch(Exception e) {
System.err.println(“Co loi xay ra :"
+ e.getMessage());
e.printStackTrace();
}
}
static int calculate(int no, int no1) {
int num = no / no1;
return num;
}
}
23
23
b. Lớp Error
v Gồm các ngoại lệ nghiêm trọng không thể kiểm tra
(unchecked excep=on) thể xảy ra nhiều phần
của chương trình.
v Còn gọi ngoại lệ không thể phục hồi (un-recoverable
excep=on)
v Không cần kiểm tra trong nguồn Java của bạn
v Các lớp con:
§ VirtualMachineError: InternalError, OutOfMemoryError,
StackOverflowError, UnknownError
§ ThreadDeath
§ LinkageError:
Incompa(bleClassChangeError
AbstractMethodError, Instan(a(onError, NoSuchFieldError,
NoSuchMethodError
§
24
7
c. Lớp Exception
v !"#$ %&% '()* +,()* '-
+.+/0"1* 234 56 78 '9 "(:% ;<
+"*-=>
v ?,@A* BC+, %D 4"E 4)( F$G%&%
+,()* '- %;$ F*.+, =H+" 2I+,
%&%" JK 4"L$ 4L M7%N0O(+
v PQ+O=NM7%N0O(+ %D 4"E R@S%
T4Q+,UGF$G4F(+, VQ& 4FH+" WXYG
4"Z% "*-+
§ Không bắt buộc phải bắt ngoại lệ
thể xảy ra lỗi
§ Không nên viết ngoại lệ của riêng
mình kế thừa từ lớp này
25
25
Một số lớp con của Exception
v !'$[[?(4\(Q+BM7%N0O(+]G^_`M7%N0O(+
v a$5$>*(>bcM7%N0O(+d
§ FileNotFoundExcep>on, EOFExcep>on…
v PQ+O=NM7%N0O(+dG
§ NullPointerExcep>on, BufferOverflowExcep>on
§ ClassCastExcep>on, Arithme>cExcep>on
§ IndexOutOfBoundsExcep>on:
ArrayIndexOutOfBoundsExcep%on,
StringIndexOutOfBoundsExcep%on…
§ IllegalArgumentExcep>on:
NumberFormatExcep%on, InvalidParameterExcep%on…
§
26
26
Ví dụ IOException
import java.io.InputStreamReader;
import java.io.IOException;
public class HelloWorld{
public static void main(String[] args) {
InputStreamReader isr = new
InputStreamReader(System.in);
try {
System.out.print("Nhap vao 1 ky tu: ");
char c = (char) isr.read();
System.out.println("Ky tu vua nhap: " + c);
}catch(IOException ioe) {
ioe.printStackTrace();
}
}
}
27
27
2.3.3. Khối try catch lồng nhau
v Những phần nhỏ trong khối sinh ra một lỗi, nhưng toàn
bộ cả khối thì lại sinh ra một lỗi khác à Cần các xử
ngoại lệ lồng nhau.
v Khi các khối try lồng nhau, khối try bên trong sẽ được thực
hiện trước.
try {
// Doan ma co the gay ra IOException
try {
// Doan ma co the gay ra NumberFormatException }
catch (NumberFormatException e1) {
// Xu ly loi sai dinh dang so
}
} catch (IOException e2) {
// Xu ly loi vao ra
}
28
28
8
2.3.4. Nhiều khối catch
v Ye4GR()+G=ã %DG4"EG,f<GF$G+"*gQG"h+G=e4Gngoi
lệ à S8GBi+,G+"*gQGJ"j*G%$4%">
try {
// Doan ma co the gay ra nhieu ngoai le
} catch (ExceptionType1 e1) {
// Xu ly ngoai le 1
} catch (ExceptionType2 e2) {
// Xu ly ngoai le 2
} ...
v ExceptionType1 phi là lớp con hoc ngang
ng vi ExceptionType2 (trong cây phân cp
kế tha)
29
29
vExceptionType1 phi là lớp con hoc ngang hàng
với ExceptionType2 (trong cây phân cp kế tha)
class MultipleCatch1 {
public static void main(String args[])
{
try {
String num = args[0];
int numValue = Integer.parseInt(num);
System.out.println("Dien tich hv la: "
+ numValue * numValue);
} catch(Exception e1) {
System.out.println("Hay nhap canh cua hv!");
} catch(NumberFormatException e2){
System.out.println("Not a number!");
}
}
}
30
D:\exception java.lang.NumberFormatException has already been
caught
Li
30
vExceptionType1 phi là lớp con hoc ngang hàng
với ExceptionType2 (trong cây phân cp kế tha)
class MultipleCatch1 {
public static void main(String args[])
{
try {
String num = args[0];
int numValue = Integer.parseInt(num);
System.out.println("Dien tich hv la: "
+ numValue * numValue);
} catch(ArrayIndexOutOfBoundsException e1) {
System.out.println(“Hay nhap canh cua hv!");
} catch(NumberFormatException e2){
System.out.println(“Hay nhap 1 so!");
}
}
}
31
31
class MultiCatch2 {
public static void main( String args[]) {
try {
// format a number
// read a file
// something else...
}
catch(IOException e) {
System.out.println("I/O error "+e.getMessage();
}
catch(NumberFormatException e) {
System.out.println("Bad data "+e.getMessage();
}
catch(Throwable e) { // catch all
System.out.println("error: " + e.getMessage();}
}
}
}
32
32
9
...
public void openFile(){
try {
// constructor may throw FileNotFoundException
FileReader reader = new FileReader("someFile");
int i=0;
while(i != -1) {
//reader.read() may throw IOException
i = reader.read();
System.out.println((char) i );
}
reader.close();
System.out.println("--- File End ---");
} catch (FileNotFoundException e) {
//do something clever with the exception
} catch (IOException e) {
//do something clever with the exception
}
}
...
33
33
2.3.5. Khối finally
v Đm bo thc hin tt c các công vic cn
thiết khi có ngoi l xy ra
§ Đóng file, đóng socket, connection
§ Gii phóng tài nguyên (nếu cn)...
v !"3%G%"3+G[kG4"Z%Ghin BCGngoi l có 71<GF$G"$<G
J"l+,>
34
catch block finally
Exception
finally
No exception
try block
34
pháp try ... catch ... finally
try {
// Khoi lenh co the sinh ngoai le
} catch(ExceptionType e) {
// Bat va xu ly ngoai le
} finally {
/* Thuc hien cac cong viec can thiet
du ngoai le co xay ra hay khong */
}
v ?ếu đã có khi try thì bắt buc phi có khi
catch hoc khi finally hoc c hai
35
35
class StrExceptionDemo {
static String str;
public static void main(String s[]) {
try {
System.out.println(“Truoc ngoai le");
staticLengthmethod();
System.out.println(“Sau ngoai le");
}
catch(NullPointerException ne) {
System.out.println(“Da xay ra loi");
}
finally {
System.out.println(“Trong finally");
}
}
static void staticLengthmethod() {
System.out.println(str.length());
}
}
36
36
10
public void openFile(){
try {
// constructor may throw FileNotFoundException
FileReader reader = new FileReader("someFile");
int i=0;
while(i != -1) {
//reader.read() may throw IOException
i = reader.read();
System.out.println((char) i );
}
} catch (FileNotFoundException e) {
//do something clever with the exception
} catch (IOException e) {
//do something clever with the exception
} finally {
reader.close();
System.out.println("--- File End ---");
}
}
37
37
Nội dung
1. Ngoại lệ
2. Bt và x ngoi l
3. y nhim ngoi l
4. Tạo ngoi l t định nghĩa
38
38
Hai cách m vic vi ngoại l
v X lý ngay
§ Sử dụng khi try ... catch (finally nếu cn)z
v y nhiệm %"( 5m 4Fn ,o* +D:
§ Nếu không mun x lý ngay
§ Sử dụng throw và throws
39
39
3.1. Ủy nhiệm ngoại lệ
v Phương thc có th y nhim ngoi l cho v trí
gọi nó bng cách:
§ S dng throws Excep>onType phn khai báo phương thc
để o hiu cho v trí gi nó biết là nó có th phát sinh ngoi
lệ ExceptionType
§ Sdụng throw để tung ra ngoại lệ kiểu ExceptionType trong
thân phương thc khi cần
v dụ
public void myMethod(int param) throws
Exception{
if (param < 10) {
throw new Exception("Too low!");
}
//Blah, Blah, Blah...
}
40
40
11
3.1. y nhim ngoi l (2)
v ?ếu phương thc có cha câu lnh tung
ngoi l (throw) thì phn khai báo phương
thc phi khai báo là tung ngoi l đó hoc
lớp cha ca ngoi l đó
public void myMethod(int param) {
if (param < 10) {
throw new Exception("Too low!");
}
//Blah, Blah, Blah...
}
à S%(neW('n{-n\!ne,W%-|^c^z`^%&z=\!ne,W%}-VSx'-3n--
!^S&"'-W(-{n!`^(n{-'W-3n-'"(W~%
41
41
3.1. y nhim ngoi l (3)
v p"@h+,G4"#%GJ"l+,G%q+G0"1*GJ"$*G2&(G[kG4Q+,GF$G
PQ+O=NM7%N0O(+G5HG+,()*G'-G+6<G=:%GRm+"GR@S%G
;<G+"*-=G%"(GWXY
v XnGBi
class Test {
public void myMethod(int param) {
if (param < 10) {
throw new RuntimeException("Too
low!");
}
//Blah, Blah, Blah...
}
}
§ à Không lỗi
42
42
3.1. Ủy nhiệm ngoại lệ (3)
v Ti v trí gọi phương thc có y nhim ngoi
lệ r4FLGPQ+O=NM7%N0O(+sd
§ Hoc là phương thc cha v trí đó phi y nhim tiếp
cho v trí gọi mình
§ Hoc là tại ví trí gi phi bt ngoi l y nhim (hoc
lớp cha) và x ngay bng try...catch (finally nếu cn)
43
43
public class DelegateExceptionDemo {
public static void main(String args[]){
int num = calculate(9,3);
System.out.println(“Lan 1: ” + num);
num = calculate(9,0);
System.out.println(“Lan 2: ” + num);
}
static int calculate(int no, int no1)
throws ArithmeticException {
if (no1 == 0)
throw new
ArithmeticException("Khong the chia cho 0!");
int num = no / no1;
return num;
}
}
44
Run
44
12
public class DelegateExceptionDemo {
public static void main(String args[]){
int num = calculate(9,3);
System.out.println(“Lan 1: ” + num);
num = calculate(9,0);
System.out.println(“Lan 2: ” + num);
}
static int calculate(int no, int no1)
throws Exception {
if (no1 == 0)
throw new
ArithmeticException("Khong the chia cho 0!");
int num = no / no1;
return num;
}
}
45
Compile
G:\Java Example\DelegateExceptionDemo.java:3: unreported exception java.lang.Exception;
must be caught or declared to be thrown
int num = calculate(9,3);
^
G:\Java Example\DelegateExceptionDemo.java:5: unreported exception java.lang.Exception;
must be caught or declared to be thrown
num = calculate(9,0);
45
public class DelegateExceptionDemo {
public static void main(String args[]){
try {
int num = calculate(9,3);
System.out.println(“Lan 1: ” + num);
num = calculate(9,0);
System.out.println(“Lan 2: ” + num);
} catch(Exception e) {
System.out.println(e.getMessage());
}
}
static int calculate(int no, int no1)
throws ArithmeticException {
if (no1 == 0)
throw new
ArithmeticException("Khong the chia cho 0!");
int num = no / no1;
return num;
}
}
46
46
3.1. y nhim ngoi l (4)
v Mt phương thc có th y nhim nhiu hơn
1 ngoi l
public void myMethod(int tuoi, String ten)
throws ArithmeticException, NullPointerException{
if (tuoi < 18) {
throw new ArithmeticException(“Chua du tuoi!");
}
if (ten == null) {
throw new NullPointerException(“Thieu ten!");
}
//Blah, Blah, Blah...
}
47
47
3.2. Lan truyền ngoại lệ
v tH+"G"Qj+,d
§ Giả sử trong main() gọi phương thức A(), trong A() gọi B(),
trong B() gọi C(). Khi đó một ngăn xếp các phương thức
được tạo ra.
§ Giả sử trong C() xảy ra ngoại lệ.
48
48
13
C()
B()
A()
main()
B()
A()
main()
C() tung ngoại lệ
3.2. Lan truyền ngoại lệ (2)
v Nếu C() gặp lỗi tung ra ngoại lệ nhưng trong C() lại không
xử ngoại lệ này, thì chỉ còn một nơi thể xử chính
nơi C() được gọi, đó trong phương thức B().
v Nếu trong B() cũng không xử thì phải xử ngoại lệ này
trong A() Quá trình này gọi lan truyền ngoi lệ
v Nếu đến main() cũng không xử ngoại lệ được tung từ C()
thì chương trình sẽ phải dừng lại.
49
49
3.3. Kế thừa và ủy nhiệm ngoại l
v u"*Goverride =e4G0"@h+,G4"#% của lp cha]G
0"@h+,G4"#%GvG'w0G%(+GJ"l+,GR@S%G0"x0G4Q+,GF$G
%&%Gngoi l =w*
v à Phương thc ghi đè trong lp con c"yGR@S%G
0"x0G4Q+,GF$G%&%Gngoi l ,*j+,Ghoc là lp con
"(:%G'6G4z0G%(+Gcủa các ngoi l đưc tung ra
lớp cha>
50
50
3.3. Kế thừa và ủy nhiệm ngoại lệ (2)
51
class Disk {
void readFile() throws EOFException {}
}
class FloppyDisk extends Disk {
void readFile() throws IOException {} // ERROR!
}
class Disk {
void readFile() throws IOException {}
}
class FloppyDisk extends Disk {
void readFile() throws EOFException {} //OK
}
51
3.4. Ưu điểm của ủy nhiệm ngoại lệ
v {| [8 Bi+,
§ JvV !"#$%& '()%" {• *€! cv ^% 'Wv% "$%
§ I• {v%& !"S/k% *QRS 0"Qk% *1% %$Q !P 0"] %q%& \g `h
%&W_Q `T
§ AP '"k %•V %"QRS `W_Q %&W_Q `T
v t&%" 78 '9 +,()* '- J"}* đoạn mã thông thưng
v u"l+, 2} [D4 +,()* '- (nx= 4Z Re+,)
v Gom nhóm phân loại c ngoi lệ
v u`d Làm chương trình dễ đọc an toàn n
52
52
14
Nội dung
1. Ngoại lệ
2. Bt và x ngoi l
3. y nhim ngoi l
4. Tạo ngoi l tự định nghĩa
53
53
4. Tạo ngoại lệ tự định nghĩa
v Các ngoi l do hệ thống xây dựng không đủ để kiểm
soát tất cả các lỗi à Cần phải có các lớp ngoi l do
người dùng định nghĩa.
§ Kế thừa từ một lớp Exception hoc lp con ca nó
§ Có tất cả các phương thức của lớp Throwable
public class MyException extends Exception {
public MyException(String msg) {
super(msg);
}
public MyException(String msg, Throwable cause){
super(msg, cause);
}
}
54
54
public class FileExample
{
public void copyFile(String fName1,String fName2)
throws MyException
{
if (fName1.equals(fName2))
throw new MyException("File trung ten");
// Copy file
System.out.println("Copy completed");
}
}
Khaio kh năng tung ngoi l
Tung ngoi l
Sử dụng ngoại lệ người dùng định nghĩa
55
55
Sử dụng ngoại lệ người dùng định nghĩa
56
v Bt và xử lý +,()*G'-
public class Test {
public static void main(String[] args) {
FileExample obj = new FileExample();
try {
String a = args[0];
String b = args[1];
obj.copyFile(a,b);
} catch (MyException e1) {
System.out.println(e1.getMessage());
}
catch(Exception e2) {
System.out.println(e2.toString());
}
}
}
56
15
Tổng kết
v ~•4G%#GJ"*G+6(G%DG=e4G'€*G71<GF$GJ"*G4"Z%G"*-+G
%"@h+,G4FH+"G4"HG=e4G+,()*G'-GR•G7Q•4G"*-+>G
v Yo*G+,()*G'-GRgG0"1*GR@S%G78G'9G+KQGJ"l+,G=Qj+G
%"@h+,G4FH+"GJK4G4"‚%G=e4G%&%"G2•4G4"@A+,>G
v ƒ8G'9G+,()*G'-G%"(G0"x0GJK4G"S0G56G78G'9G'€*G4)*G=e4G
+h*>G
v W$5$G[8GBi+,GJ"j*G4F</%$4%"GREGVQ1+G'9G+,()*G'->G
57
57
Tổng kết (2)
v !&%G%fQG'-+"G4F(+,GJ"j*G4F<G4Q+,GF$G+,()*G'-]G56G
5*-%G78G'9G%&%G+,()*G'-GRDGB*|+GF$G4F(+,GJ"j*G%$4%">
v ?"*gQGJ"j*G%$4%"G%DG4"EGR@S%G[8GBi+,GREG78G'9G
4&%"G2*-4G%&%G'()*G+,()*G'-GJ"&%G+"$Q>
v tLGJ"D$G4"F([GGR@S%G[8GBi+,GREG'*-4GJ.G=*GB$+"G
[&%"G%&%G+,()*G'-G=6G=e4G0"@h+,G4"#%G%DG4"EG
4Q+,GF$>
v tLGJ"D$G4"F(GR@S%G[8GBi+,GREG4Q+,GF$G=e4G+,()*G
'->
v u"j*G…+$''<GREG4"Z%G"*-+G%&%G%l+,G5*-%G%q+G4"*K4GBCG
%DG+,()*G'-G71<GF$G"$<GJ"l+,>
58
58
Bài tập
59
59
Bài tập 1
v Hệ thống liên tục nhận các giá trị đầu vào là xâu đại
diện cho một số nguyên, yêu cầu mỗi lần nhận được
một số thì tính trung bình cộng của các giá trị đã
nhận.
v Xây dựng phương thức:
§ public double getAverage(string x) với thuộc tính average, N
có sẵn trong lớp
v Hãy cài đặt phương thức trong đó có xử lý các ngoại
lệ xảy ra:
§ Xâu đầu vào xâu rỗng
§ Xâu đầu vào không phải là số
§ Xâu đầu vào không phải là số nguyên
60
60
60
16
Bài tập 2
v Hệ thống cần đọc file để lấy ra một dãy các con số
(mỗi dòng một số nguyên)
§ Dòng 1 của file là số lượng các số có trong file
§ Mỗi dòng một snguyên
v Xây dựng phương thức đọc dãy số:
§ public void readListIntegers(String fileName)
v Hãy xử lý các ngoại lệ:
§ Xâu tên file là xâu rỗng
§ Không tìm thấy file
§ Không mở được file
§ Các xâu trong từng dòng của file không phải đại diện cho
con số
61
61
61
Bài tập 3
v Hệ thống cần đọc file đầu vào để lấy ra một dãy các
con số (mỗi dòng một số nguyên), sau đó tách ra
thành 4 phần bằng nhau và ghi ra các file khác nhau.
§ Dòng 1 của file đầu vào là số lượng các số trong file. Mỗi
dòng sau đó là một số nguyên
§ Xây dựng phương thức phân tách dãy số:
public void splitListIntegers(String fileName)
v Hãy xử lý các ngoại lệ:
§ Xâu tên file là xâu rỗng
§ Không tìm thấy file
§ Không mở được file
§ Các xâu trong từng dòng của file không phải đại diện cho
con số
§ Không ghi được file mới
62
62
62

Preview text:

Mục tiêu của bài học
v Giải thích về ngoại lệ là gì và mô tả các lợi ích của
việc xử lý ngoại lệ hướng đối tượng
v Giải thích được mô hình xử lý ngoại lệ
Bài 10. Ngoại lệ và xử
v Sử dụng khối try/catch/final y để bắt và xử lý lý ngoại lệ ngoại lệ trong Java
v Hiểu và biết cách sử dụng ủy nhiệm ngoại lệ
v Biết cách tạo ra và sử dụng ngoại lệ tự định nghĩa 1 2 1 2 Nội dung Nội dung 1. Ngoại lệ 1. Ngoại lệ
2. Bắt và xử lý ngoại lệ
2. Bắt và xử lý ngoại lệ 3. Ủy nhiệm ngoại lệ 3. Ủy nhiệm ngoại lệ
4. Tạo ngoại lệ tự định nghĩa
4. Tạo ngoại lệ tự định nghĩa 3 4 3 4 1
1.1. Ngoại lệ là gì?
1.1. Ngoại lệ là gì? (2)
v Exception = Exceptional event
v Ngoại lệ là một lỗi đặc biệt
v Định nghĩa: Ngoại lệ là một sự kiện xảy ra
v Khi xảy ra một ngoại lệ, nếu không xử lý thì
trong quá trình thực thi chương trình, nó phá
chương trình kết thúc ngay và trả lại quyền điều
vỡ luồng bình thường của chương trình
khiển cho hệ điều hành. ERROR !! Ví dụ: 5 6 5 6
1.2. Cách xử lý lỗi truyền thống Ví dụ
v Viết mã xử lý tại nơi phát sinh ra lỗi
int devide(int num, int denom, int *error)
§ Làm cho chương trình trở nên rối {
§ Không phải lúc nào cũng đầy đủ thông >n để xử lý if (denom != 0){
§ Không nhất thiết phải xử lý error = 0;
v Truyền trạng thái lên mức trên return num/denom; } else {
§ Thông qua tham số, giá trị trả lại hoặc biến tổng thể (flag) error = 1; § Dễ nhầm return 0; § Vẫn còn khó hiểu } } 7 8 7 8 2 Nhược điểm Nội dung
v Khó kiểm soát được hết các trường hợp 1. Ngoại lệ
§ Lỗi số học, lỗi bộ nhớ,…
2. Bắt và xử lý ngoại lệ
v Lập trình viên thường quên không xử lý lỗi § Bản chất con người 3. Ủy nhiệm ngoại lệ
§ Thiếu kinh nghiệm, cố ?nh bỏ qua
4. Tạo ngoại lệ tự định nghĩa 9 10 9 10
2.1. Mục đích của xử lý ngoại lệ
2.1. Mục đích của xử lý ngoại lệ (2)
v Giúp chương trình đáng ,n cậy hơn, tránh kết thúc bất
v Khi xảy ra ngoại lệ, nếu không có cơ chế xử lý thích thường hợp:
v Tách biệt khối lệnh có thể gây ngoại lệ và khối lệnh
§ Chương trình bị ngắt khi ngoại lệ xảy ra xử lý ngoại lệ
§ Các tài nguyên không được giải phóng à Lãng phí ………… v Ví dụ: Vào/ra tệp gn IF B IS ZERO GO TO ERROR
§ Nếu ngoại lệ xảy ra (ví dụ như chuyển đổi kiểu không đúng) C = A/B
à Chương trình kết thúc mà không đóng tệp >n lại PRINT C
• Tệp %n không thể truy cập/hỏng GO TO EXIT
• Tài nguyên cấp phát không được giải phóng ERROR: Khối xử lý lỗi DISPLAY “DIVISION BY ZERO” EXIT: END 12 11 12 3
2.2. Mô hình xử lý ngoại lệ
2.2. Mô hình xử lý ngoại lệ (2) v Hướng đối tượng
v Ngoại lệ cần phải được xử lý ở tại phương thức
§ Đóng gói các điều kiện không mong đợi trong một đối
sinh ra ngoại lệ hoặc ủy nhiệm cho phương thức tượng gọi đến
§ Khi xảy ra ngoại lệ, đối tượng tương ứng với ngoại lệ
được tạo ra chứa thông ,n chi ,ết về ngoại lệ
§ Cung cấp cơ chế hiệu quả trong việc xử lý lỗi
§ Tách biệt luồng điều khiển bất thường với luồng bình thường 13 14 13 14
2.3. Xử lý ngoại lệ trong Java
2.3. Xử lý ngoại lệ trong Java (2) v Các từ khóa
v Java có cơ chế xử lý ngoại lệ rất § try mạnh § catch
v Xử lý ngoại lệ trong Java được thực § finally
hiện theo mô hình hướng đối tượng: § throw
§ Tất cả các ngoại lệ đều là thể hiện của
một lớp kế thừa từ lớp Throwable hoặc § throws các lớp con của nó
§ Các đối tượng này có nhiệm vụ chuyển
thông >n về ngoại lệ (loại và trạng thái
của chương trình) từ vị trí xảy ra ngoại
lệ đến nơi quản lý/xử lý nó. 15 16 15 16 4 2.3.1. Khối try/catch
Ví dụ không xử lý ngoại lệ
v Khối try ... catch: Phân tách đoạn chương trình class NoException {
thông thường và phần xử lý ngoại lệ
public static void main(String args[]) {
§ try {…}: Khối lệnh có khả năng gây ra ngoại lệ String text = args[0];
§ catch() {…}: Bắt và xử lý với ngoại lệ
System.out.println(text); try { }
// Doan ma co the gay ngoai le }
} catch (ExceptionType e) { // Xu ly ngoai le }
v ExceptionType là một lớp con của Throwable 17 18 17 18
Ví dụ có xử lý ngoại lệ Ví dụ chia cho 0
public class ChiaCho0Demo {
class ArgExceptionDemo {
public static void main(String args[]){
public static void main(String args[]) { try { try {
int num = calculate(9,0); String text = args[0];
System.out.println(num);
System.out.println(text); } } catch(Exception e) { catch(Exception e) {
System.err.println("Co loi xay ra: " + e.toString());
System.out.println(“Hay nhap tham so khi chay!"); } } } }
static int calculate(int no, int no1){ } int num = no / no1; return num; } } 19 20 19 20 5
2.3.2. Cây phân cấp ngoại lệ trong Java a. Lớp Throwable
v Một biến kiểu String để lưu thông gn chi gết về
Error chỉ ra các lỗi đặc ngoại lệ đã xảy ra
biệt nghiêm trọng, những
Throwable là một lớp
lỗi này chương trình Exce sở, pti o n n ó l à cu lớn p g c cấp ơ s
v Một số phương thức cơ bản
không thể quản lý được. Ob ject gi ch a o o t di ất ện cả và các lsự ỗi thự có t c h VD: VirtualMachineError
§ new Throwable(String s): Tạo một ngoại lệ thi ki cho ểm h soầu át h đ ế ư t ợ c c.ác OutOfMemoryError VD: Ari ngoạ
thmeti ic lEệx.ception,
với thông tin về ngoại lệ là s Throwable BufferOverflowException
§ String getMessage(): Lấy thông ,n về ngoại lệ
§ void printStackTrace(): In ra tất cả các thông Error Exception
,n liên quan đến ngoại lệ (tên, loại, vị trí...) § … RuntimeException ... ... ... 21 22 21 22 b. Lớp Error
public class StckExceptionDemo {
public static void main(String args[]){
v Gồm các ngoại lệ nghiêm trọng không thể kiểm tra try {
(unchecked excep=on) vì có thể xảy ra ở nhiều phần
int num = calculate(9,0); của chương trình.
System.out.println(num);
v Còn gọi là ngoại lệ không thể phục hồi (un-recoverable } excep=on) catch(Exception e) {
System.err.println(“Co loi xay ra :"
v Không cần kiểm tra trong mã nguồn Java của bạn + e.getMessage()); v Các lớp con: e.printStackTrace();
§ VirtualMachineError: InternalError, OutOfMemoryError, }
StackOverflowError, UnknownError } § ThreadDeath
static int calculate(int no, int no1) { § LinkageError: int num = no / no1;
• Incompa(bleClassChangeError return num;
• AbstractMethodError, Instan(a(onError, NoSuchFieldError, } NoSuchMethodError… } • … § … 23 23 24 6 c. Lớp Exception
Một số lớp con của Exception
v Chứa các loại ngoại lệ
v ClassNotFoundExcepOon, SQLExcepOon
nên/phải bắt và xử lý hoặc ủy v java.io.IOExcepOon: nhiệm.
§ FileNotFoundExcep>on, EOFExcep>on…
v Người dùng có thể tạo ra các v RunOmeExcepOon:
ngoại lệ của riêng mình bằng
§ Nul PointerExcep>on, BufferOverflowExcep>on
cách kế thừa từ ExcepOon
§ ClassCastExcep>on, Arithme>cExcep>on
v RunOmeExcepOon có thể được
§ IndexOutOfBoundsExcep>on:
“tung” ra trong quá trình JVM
• ArrayIndexOutOfBoundsExcep%on, thực hiện
• StringIndexOutOfBoundsExcep%on…
§ Không bắt buộc phải bắt ngoại lệ § IllegalArgumentExcep>on: dù có thể xảy ra lỗi
• NumberFormatExcep%on, InvalidParameterExcep%on…
§ Không nên viết ngoại lệ của riêng § …
mình kế thừa từ lớp này 25 26 25 26 Ví dụ IOException
2.3.3. Khối try – catch lồng nhau
v Những phần nhỏ trong khối mã sinh ra một lỗi, nhưng toàn
import java.io.InputStreamReader;
bộ cả khối thì lại sinh ra một lỗi khác à Cần có các xử lý
import java.io.IOException; ngoại lệ lồng nhau.
public class HelloWorld{
v Khi các khối try lồng nhau, khối try bên trong sẽ được thực
public static void main(String[] args) { hiện trước.
InputStreamReader isr = new
InputStreamReader(System.in); try { try {
System.out.print("Nhap vao 1 ky tu: ");
// Doan ma co the gay ra IOException
char c = (char) isr.read(); try {
System.out.println("Ky tu vua nhap: " + c);
// Doan ma co the gay ra NumberFormatException }
catch (NumberFormatException e1) {
}catch(IOException ioe) { ioe.printStackTrace();
// Xu ly loi sai dinh dang so } }
} catch (IOException e2) { } // Xu ly loi vao ra } } 27 28 27 28 7
2.3.4. Nhiều khối catch
vExceptionType1 phải là lớp con hoặc ngang hàng
v Một đoạn mã có thể gây ra nhiều hơn một ngoại
với ExceptionType2 (trong cây phân cấp kế thừa)
lệ à Sử dụng nhiều khối catch. class MultipleCatch1 { try {
public static void main(String args[])
// Doan ma co the gay ra nhieu ngoai le {
} catch (ExceptionType1 e1) { try { String num = args[0]; // Xu ly ngoai le 1
int numValue = Integer.parseInt(num);
} catch (ExceptionType2 e2) {
System.out.println("Dien tich hv la: " + numValue * numValue); // Xu ly ngoai le 2 } catch(Exception e1) { } ...
System.out.println("Hay nhap canh cua hv!");
} catch(NumberFormatException e2){
v ExceptionType1 phải là lớp con hoặc ngang
System.out.println("Not a number!");
hàng với ExceptionType2 (trong cây phân cấp } kế thừa) }
D:\exception java.lang.NumberFormatException has already been } Lỗi caught 29 30 29 30
vExceptionType1 phải là lớp con hoặc ngang hàng class MultiCatch2 {
với ExceptionType2 (trong cây phân cấp kế thừa)
public static void main( String args[]) { try { class MultipleCatch1 { // format a number
public static void main(String args[]) // read a file { // something else... try { } String num = args[0]; catch(IOException e) {
System.out.println("I/O error "+e.getMessage();
int numValue = Integer.parseInt(num); }
System.out.println("Dien tich hv la: "
catch(NumberFormatException e) { + numValue * numValue);
System.out.println("Bad data "+e.getMessage();
} catch(ArrayIndexOutOfBoundsException e1) { }
System.out.println(“Hay nhap canh cua hv!");
catch(Throwable e) { // catch all
} catch(NumberFormatException e2){
System.out.println("error: " + e.getMessage();}
System.out.println(“Hay nhap 1 so!"); } } } } } 31 32 } 31 32 8 2.3.5. Khối finally ... public void openFile(){
v Đảm bảo thực hiện tất cả các công việc cần try {
// constructor may throw FileNotFoundException
thiết khi có ngoại lệ xảy ra
FileReader reader = new FileReader("someFile");
§ Đóng file, đóng socket, connection int i=0;
§ Giải phóng tài nguyên (nếu cần)... while(i != -1) {
//reader.read() may throw IOException
v Chắc chắn sẽ thực hiện dù ngoại lệ có xảy ra hay i = reader.read(); không.
System.out.println((char) i ); } reader.close(); No exception finally
System.out.println("--- File End ---");
} catch (FileNotFoundException e) {
//do something clever with the exception try block
} catch (IOException e) { catch block finally
//do something clever with the exception Exception } } ... 33 34 33 34
Cú pháp try ... catch ... finally
class StrExceptionDemo { try { static String str;
// Khoi lenh co the sinh ngoai le
public static void main(String s[]) { try {
} catch(ExceptionType e) {
System.out.println(“Truoc ngoai le");
// Bat va xu ly ngoai le staticLengthmethod();
System.out.println(“Sau ngoai le"); } finally { }
/* Thuc hien cac cong viec can thiet
catch(NullPointerException ne) {
du ngoai le co xay ra hay khong */
System.out.println(“Da xay ra loi"); } } finally {
v Nếu đã có khối try thì bắt buộc phải có khối
System.out.println(“Trong finally");
catch hoặc khối finally hoặc cả hai } }
static void staticLengthmethod() {
System.out.println(str.length()); } 35 } 36 35 36 9 Nội dung
public void openFile(){ try { 1. Ngoại lệ
// constructor may throw FileNotFoundException
FileReader reader = new FileReader("someFile"); int i=0;

2. Bắt và xử lý ngoại lệ while(i != -1) {
//reader.read() may throw IOException
3. Ủy nhiệm ngoại lệ i = reader.read();
System.out.println((char) i );

4. Tạo ngoại lệ tự định nghĩa }
} catch (FileNotFoundException e) {
//do something clever with the exception
} catch (IOException e) {
//do something clever with the exception } finally { reader.close();
System.out.println("--- File End ---");
} } 37 38 37 38
Hai cách làm việc với ngoại lệ
3.1. Ủy nhiệm ngoại lệ v Xử lý ngay
v Phương thức có thể ủy nhiệm ngoại lệ cho vị trí
§ Sử dụng khối try ... catch (finally nếu cần). gọi nó bằng cách:
§ Sử dụng throws Excep>onType ở phần khai báo phương thức
v Ủy nhiệm cho vị trí gọi nó:
để báo hiệu cho vị trí gọi nó biết là nó có thể phát sinh ngoại lệ ExceptionType §
Nếu không muốn xử lý ngay
§ Sử dụng throw để tung ra ngoại lệ kiểu ExceptionType trong
thân phương thức khi cần § Sử dụng throw và throws v Ví dụ
public void myMethod(int param) throws Exception{ if (param < 10) {
throw new Exception("Too low!"); } //Blah, Blah, Blah... } 39 40 39 40 10
3.1. Ủy nhiệm ngoại lệ (2)
3.1. Ủy nhiệm ngoại lệ (3)
v Nếu phương thức có chứa câu lệnh tung
v Phương thức không cần phải khai báo sẽ tung ra
ngoại lệ (throw) thì phần khai báo phương
RunOmeExcepOon vì ngoại lệ này mặc định được
thức phải khai báo là có tung ngoại lệ đó hoặc ủy nhiệm cho JVM
lớp cha của ngoại lệ đó v Ví dụ
public void myMethod(int param) { class Test {
public void myMethod(int param) { if (param < 10) { if (param < 10) {
throw new Exception("Too low!");
throw new RuntimeException("Too } low!"); //Blah, Blah, Blah... } //Blah, Blah, Blah... } }
à unreported excep,on java.lang.Excep,on; must be }
caught or declared to be thrown § à Không lỗi 41 42 41 42
3.1. Ủy nhiệm ngoại lệ (3)
public class DelegateExceptionDemo {
public static void main(String args[]){
v Tại vị trí gọi phương thức có ủy nhiệm ngoại
int num = calculate(9,3); lệ (trừ RunOmeExcepOon):
System.out.println(“Lan 1: ” + num);
§ Hoặc là phương thức chứa vị trí đó phải ủy nhiệm tiếp num = calculate(9,0); cho vị trí gọi mình
System.out.println(“Lan 2: ” + num);
§ Hoặc là tại ví trí gọi phải bắt ngoại lệ ủy nhiệm (hoặc }
lớp cha) và xử lý ngay bằng try...catch (finally nếu cần)
static int calculate(int no, int no1)
throws ArithmeticException { if (no1 == 0) throw new
ArithmeticException("Khong the chia cho 0!"); int num = no / no1; Ru return num; n } } 43 44 43 44 11
public class DelegateExceptionDemo {
public static void main(String args[]){
public class DelegateExceptionDemo {
int num = calculate(9,3);
public static void main(String args[]){
System.out.println(“Lan 1: ” + num); try { num = calculate(9,0);
int num = calculate(9,3);
System.out.println(“Lan 2: ” + num);
System.out.println(“Lan 1: ” + num); } num = calculate(9,0);
static int calculate(int no, int no1)
System.out.println(“Lan 2: ” + num); throws Exception { } catch(Exception e) {
System.out.println(e.getMessage()); if (no1 == 0) } throw new }
ArithmeticException("Khong the chia cho 0!"); Co
static int calculate(int no, int no1) int num = no / no1; m
throws ArithmeticException { return num; p i if (no1 == 0) } le throw new }
ArithmeticException("Khong the chia cho 0!");
G:\Java Example\DelegateExceptionDemo.java:3: unreported exception java.lang.Exception;
must be caught or declared to be thrown int num = no / no1; int num = calculate(9,3); return num; ^ }
G:\Java Example\DelegateExceptionDemo.java:5: unreported exception java.lang.Exception; }
must be caught or declared to be thrown 45 46 num = calculate(9,0); 45 46
3.1. Ủy nhiệm ngoại lệ (4)
3.2. Lan truyền ngoại lệ
v Một phương thức có thể ủy nhiệm nhiều hơn v Tình huống: 1 ngoại lệ
§ Giả sử trong main() gọi phương thức A(), trong A() gọi B(),
trong B() gọi C(). Khi đó một ngăn xếp các phương thức được tạo ra.
public void myMethod(int tuoi, String ten)
§ Giả sử trong C() xảy ra ngoại lệ.
throws ArithmeticException, NullPointerException{ if (tuoi < 18) {
throw new ArithmeticException(“Chua du tuoi!"); } if (ten == null) {
throw new NullPointerException(“Thieu ten!"); } //Blah, Blah, Blah... } 47 48 47 48 12
3.2. Lan truyền ngoại lệ (2)
3.3. Kế thừa và ủy nhiệm ngoại lệ C() tung ngoại lệ
v Khi override một phương thức của lớp cha, C()
phương thức ở lớp con không được phép tung ra B() B() các ngoại lệ mới A() A() main() main()
v à Phương thức ghi đè trong lớp con chỉ được
v Nếu C() gặp lỗi và tung ra ngoại lệ nhưng trong C() lại không
phép tung ra các ngoại lệ giống hoặc là lớp con
xử lý ngoại lệ này, thì chỉ còn một nơi có thể xử lý chính là
hoặc là tập con của các ngoại lệ được tung ra
nơi mà C() được gọi, đó là trong phương thức B(). ở lớp cha.
v Nếu trong B() cũng không xử lý thì phải xử lý ngoại lệ này
trong A()… Quá trình này gọi là lan truyền ngoại lệ
v Nếu đến main() cũng không xử lý ngoại lệ được tung từ C()
thì chương trình sẽ phải dừng lại. 49 50 49 50
3.3. Kế thừa và ủy nhiệm ngoại lệ (2)
3.4. Ưu điểm của ủy nhiệm ngoại lệ class Disk { v Dễ sử dụng
void readFile() throws EOFException {}
§ Làm chương trình dễ đọc và an toàn hơn }
§ Dễ dàng chuyển điều khiển đến nơi có khả năng xử lý
class FloppyDisk extends Disk { ngoại lệ
void readFile() throws IOException {} // ERROR!
§ Có thể ném nhiều loại ngoại lệ }
v Tách xử lý ngoại lệ khỏi đoạn mã thông thường
v Không bỏ sót ngoại lệ (ném tự động) class Disk {
v Gom nhóm và phân loại các ngoại lệ
void readFile() throws IOException {}
v KL: Làm chương trình dễ đọc và an toàn hơn }
class FloppyDisk extends Disk {

void readFile() throws EOFException {} //OK } 51 52 51 52 13 Nội dung
4. Tạo ngoại lệ tự định nghĩa 1. Ngoại lệ
v Các ngoại lệ do hệ thống xây dựng không đủ để kiểm
soát tất cả các lỗi à Cần phải có các lớp ngoại lệ do
2. Bắt và xử lý ngoại lệ người dùng định nghĩa.
§ Kế thừa từ một lớp Exception hoặc lớp con của nó 3. Ủy nhiệm ngoại lệ
§ Có tất cả các phương thức của lớp Throwable
4. Tạo ngoại lệ tự định nghĩa
public class MyException extends Exception {
public MyException(String msg) { super(msg); }
public MyException(String msg, Throwable cause){ super(msg, cause); } } 53 54 53 54
Sử dụng ngoại lệ người dùng định nghĩa
Sử dụng ngoại lệ người dùng định nghĩa
Khai báo khả năng tung ngoại lệ
v Bắt và xử lý ngoại lệ
public class FileExample public class Test { {
public static void main(String[] args) {
public void copyFile(String fName1,String fName2)
FileExample obj = new FileExample(); throws MyException try { { String a = args[0];
if (fName1.equals(fName2)) String b = args[1];
throw new MyException("File trung ten"); obj.copyFile(a,b); // Copy file
} catch (MyException e1) {
System.out.println("Copy completed");
System.out.println(e1.getMessage()); } } } catch(Exception e2) {
System.out.println(e2.toString()); } Tung ngoại lệ } } 55 56 55 56 14 Tổng kết Tổng kết (2)
v Bất cứ khi nào có một lỗi xảy ra khi thực hiện
v Các câu lệnh trong khối try tung ra ngoại lệ, và
chương trình thì một ngoại lệ đã xuất hiện.
việc xử lý các ngoại lệ đó diễn ra trong khối catch.
v Mọi ngoại lệ đề phải được xử lý nếu không muốn
v Nhiều khối catch có thể được sử dụng để xử lý
chương trình kết thúc một cách bất thường.
tách biệt các loại ngoại lệ khác nhau.
v Xử lý ngoại lệ cho phép kết hợp và xử lý lỗi tại một
v Từ khóa throws được sử dụng để liệt kê mỗi danh nơi.
sách các ngoại lệ mà một phương thức có thể
v Java sử dụng khối try/catch để quản lý ngoại lệ. tung ra.
v Từ khóa throw được sử dụng để tung ra một ngoại lệ.
v Khối final y để thực hiện các công việc cần thiết dù
có ngoại lệ xảy ra hay không. 57 58 57 58 Bài tập 1
v Hệ thống liên tục nhận các giá trị đầu vào là xâu đại
diện cho một số nguyên, yêu cầu mỗi lần nhận được
một số thì tính trung bình cộng của các giá trị đã nhận. v Xây dựng phương thức: Bài tập
§ public double getAverage(string x) với thuộc tính average, N có sẵn trong lớp
v Hãy cài đặt phương thức trong đó có xử lý các ngoại lệ xảy ra:
§ Xâu đầu vào là xâu rỗng
§ Xâu đầu vào không phải là số
§ Xâu đầu vào không phải là số nguyên 59 60 60 59 60 15 Bài tập 2 Bài tập 3
v Hệ thống cần đọc file để lấy ra một dãy các con số
v Hệ thống cần đọc file đầu vào để lấy ra một dãy các
(mỗi dòng một số nguyên)
con số (mỗi dòng một số nguyên), sau đó tách ra
§ Dòng 1 của file là số lượng các số có trong file
thành 4 phần bằng nhau và ghi ra các file khác nhau.
§ Mỗi dòng là một số nguyên
§ Dòng 1 của file đầu vào là số lượng các số có trong file. Mỗi
v Xây dựng phương thức đọc dãy số:
dòng sau đó là một số nguyên
§ Xây dựng phương thức phân tách dãy số:
§ public void readListIntegers(String fileName)
• public void splitListIntegers(String fileName)
v Hãy xử lý các ngoại lệ:
v Hãy xử lý các ngoại lệ:
§ Xâu tên file là xâu rỗng
§ Xâu tên file là xâu rỗng § Không tìm thấy file § Không tìm thấy file § Không mở được file § Không mở được file
§ Các xâu trong từng dòng của file không phải là đại diện cho
§ Các xâu trong từng dòng của file không phải là đại diện cho con số con số
§ Không ghi được file mới 61 61 62 62 61 62 16