Xử lý ngoạilệ
Xử lý ngoạilệ
2
NguyễnViệtHà
Nội dung
Khái niệm về xử lý ngoại lệ (exception
handling)
Ném và bắt ngoại lệ
Khai báo ngoại lệ
Ném lại ngoại lệ
Định nghĩa ngoại lệ mới
Xử lý ngoại lệ trong constructor
Xử lý ngoạilệ
3
NguyễnViệtHà
Tài liệu tham khảo
Thinking in Java, chapter 9
Java how to program, chapter 15
Xử lý ngoạilệ
4
NguyễnViệtHà
Lỗi và ngoạilệ
Mọi đoạnchương trình đềutiềm ẩnkhả năng
sinh lỗi
lỗichủ quan: do lập trình sai
lỗi khách quan: do dữ liệu, do trạng thái củahệ thống
Ngoạilệ: các trường hợphoạt động không bình
thường
Xử lý ngoạilệ như thế nào
làm thế nào để có thể tiếptục (tái) thựchiện
Xử lý ngoạilệ
Xử lý ngoạilệ
7
NguyễnViệtHà
Xử lý ngoạilệ (Exception handling)
trong Java
Xử lý ngoạilệ trong Java đượckế thừatừ C++
Dựa trên cơ chế ném và bắtngoạilệ
ném ngoạilệ: dừng chương trình và chuyển điều
khiểnlên mứctrên (nơi bắt ngoại lệ)
bắt ngoạilệ: xử lý vớingoạilệ
Ngoại lệ: là đối tượng mang thông tin về lỗi đã
xảy ra
ngoại lệ được ném tự động
ngoại lệ được ném tường minh
Xử lý ngoạilệ
8
NguyễnViệtHà
Phả hệ ngoạilệ trong Java
Xử lý ngoạilệ
9
NguyễnViệtHà
Ưu điểmcủa ném bắt ngoạilệ
Dễ sử dụng
dàng chuyển điềukhiển đếnnơi có khả năng xử lý
ngoạilệ
có thể ném nhiều loại ngoại lệ
Tách xử lý ngoạilệ khỏi thuật toán
tách mã xử lý
sử dụng cú pháp khác
Không bỏ sót ngoại lệ (ném tự động)
throw new Exception(”denom = 0”);
} else res = num/denom;
} catch(Exception e) {
System.out.println(e.getMessage());
}
Xử lý ngoạilệ
13
NguyễnViệtHà
Cú pháp try catch finally
Có thể bắtnhiềuloại ngoạilệ khác nhau bằng
cách sử dụng nhiềukhốilệnh catch đặtkế tiếp
khốilệnh catch sau không thể bắt ngoạilệ là lớp
dẫnxuấtcủa ngoạilệđượcbắttrong khốilệnh catch
trước
Khốilệnh finally có thểđược đặtcuốicùng
để thựchiện các công việc“dọndẹp” cần thiết
finally luôn đượcthựchiện dù ngoạilệ có được
bắt hay không
finally được thực hiện cả khi không có ngoại lệ
được ném ra
Xử lý ngoạilệ
14
NguyễnViệtHà
Cú pháp try catch finally
try {
…
}
catch(Exception1 e1) {
…
}
Ném ngoạilệ khỏiphương thức
Không nhất thiết phải xử lý ngoại lệ trong
phương thức
không đủ thông tin để xử lý
không đủ thẩm quyền
Mộtphương thứcmuốn ném ngoạilệ ra
ngoài phải khai báo việc ném ngoạilệ
bằng từ khóa throws
có thể ném ngoạilệ thuộclớpdẫnxuấtcủa
ngoạilệđượckhai báo
Xử lý ngoạilệ
17
NguyễnViệtHà
Ví dụ
int readInt() throws IOException,
NumberFormatException {
str = buf.readLine();
return Integer.valueOf(str).intValue();
}
Xử lý ngoạilệ
18
NguyễnViệtHà
Ví dụ
try {
int n = readInt();
}
catch (IOException e) {
System.err.println("IO Exception");
}
}
}
class D extends A {
public void methodA() {
}
}
Xử lý ngoạilệ
21
NguyễnViệtHà
Ví dụ:
A a = new B();
try {
a.methodA();
}
catch (RuntimeException e) {
}
Xử lý ngoạilệ
22
NguyễnViệtHà
Ném lại ngoạilệ
Sau khi bắt ngoại lệ, nếu thấy cần thiết chúng ta
có thể ném lại chính ngoạilệ vừabắt được để
cho chương trình mứctrên tiếptụcxử lý
try {
}
catch (Exception e) {
System.out.println(e.getMessage());
throw e;
}
}
}
}
Xử lý ngoạilệ
25
NguyễnViệtHà
Ném ngoạilệ từ main()
Nếu không có phương thức nào bắt ngoạilệ,
ngoạilệ sẽđượctruyềnlên phương thức main()
và đượccần đượcxử lý tại đây.
Nếuvẫn không muốnxử lý ngoạilệ, chúng ta có
thểđểngoạilệ truyền lên mức điềukhiểncủa
máy ảobằng cách khai báo main() ném ngoạilệ
chương trình sẽ bị dừng và hệ thống sẽ in thông tin
về ngoại lệ trên Console (printStackTrace())