Xử lý ngoại lệ Exception trong java Ưu ñiểm của “ném” bắt ngoại lệ Một số lớp ngoại lệ Kiểm soát ngoại lệ Ngoại lệ do người dùng tạo Lan truyền ngoại lệ... Ngoại lệ: là ñối tượng ma
Trang 1Chương 4: Exceptions
GVLT: Trần Anh Dũng
Trang 2Nội dung
Giới thiệu
Cách xử lý lỗi truyền thống
Xử lý ngoại lệ (Exception) trong java
Ưu ñiểm của “ném” bắt ngoại lệ
Một số lớp ngoại lệ
Kiểm soát ngoại lệ
Ngoại lệ do người dùng tạo
Lan truyền ngoại lệ
Trang 3Giới thiệu
Mọi ñoạn chương trình ñều tiềm ẩn khả năng sinh lỗi
Lỗi chủ quan: do lập trình sai
Lỗi khách quan: do dữ liệu, do trạng thái của hệthống
Lỗi có 2 loại
?
bình thường
Trang 4Cài ñặt mã xử lý tại nơi phát sinh ra lỗi
Làm cho chương trình trở nên khó hiểu
Không phải lúc nào cũng ñầy ñủ thông tin ñể xử lý
Không nhất thiết phải xử lý
Truyền trạng thái lên mức trên
Thông qua tham số, giá trị trả lại hoặc biến tổng thể(flag)
Dễ nhầm
Khó hiểu
Cách xử lý lỗi truyền thống
Trang 5Ví dụ (1)
Block that handles error
Trang 7Khó kiểm soát ñược hết các trường hợp
Trang 8Java là ngôn ngữ mạnh, có nghĩa là tối thiểu hóa ñượclỗi và khi có lỗi thì chúng có thể ñược quản lý.
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
Dựa trên cơ chế “ném” (throw) và bắt (catch) ngoại lệ
khiển lên mức trên (nơi bắt ngoại lệ)
Bắt ngoại lệ: xử lý với ngoại lệ
Xử lý ngoại lệ trong java
Trang 9Ưu ñiểm của “ném” bắt ngoại lệ
Ưu ñiểm của “ném” bắt ngoại lệ
Dễ sử dụng
Dễ dàng chuyển ñiều khiển ñến nơi có khả năng xử
lý ngoại lệ
Có thể “ném” nhiều loại ngoại lệ
Tách xử lý ngoại lệ khỏi thuật toán
Trang 10Hierarchy of Exception Classes
Trang 11Lớp Throwable
Có một biến String ñể lưu thông tin chi tiết về ngoại lệ
ñã xảy ra
Một số phương thức cơ bản
Throwable(String s); //Tạo một ngoại lệ có tên là s
String getMessage(); //Lấy thông tin về ngoại lệ
void printStackTrace(); //In ra tất cả các thông tinliên quan ñến ngoại lệ
Một số lớp ngoại lệ (1)
Trang 12Lớp Exception
Cĩ nhiều ngoại lệ thuộc lớp con của Exception
Người dùng cĩ thể tạo ra các ngoại lệ kế thừa từException
Lớp Error
Chỉ những lỗi nghiêm trọng và khơng dự đốn trước
VirtualMachineError…
Một số lớp ngoại lệ (2)
Trang 13RuntimeException: Chỉ các ngoại lệ có thể xảy ra khiJVM thực thi chương trình
NullPointException: con trỏ null
OutOfMemoryException: hết bộ nhớ
ArithmeticException: lỗi toán học, lỗi chia không…
ClassCastException: lỗi ép kiểu
ArrayIndexOutOfBoundsException: lỗi vượt quá chỉ
số mảng
Một số lớp ngoại lệ (3)
Trang 14Các loại ngoại lệ
Java phân biệt hai loại ngoại lệ là ngoại lệ cần kiểm tra
và ngoại lệ không cần kiểm tra
Ngoại lệ unchecked
Là các ngoại lệ không bắt buộc phải kiểm tra
Gồm RuntimeException, Error và các lớp con củachúng
Ngoại lệ checked
Là các ngoại lệ bắt buộc phải ñược kiểm tra
Gồm các ngoại lệ còn lại
Trang 15ðoạn code có thể sinh ra lỗi cần ñặt trong khối lệnh bắtñầu bằng try.
ðoạn code ñể kiểm tra, xử lý trong trường hợp có lỗi xảy
ra ñặt trong khối lệnh catch
try {
// ðoạn mã có thể sinh ra lỗi …
}
catch (<Kiu Exception>){
// ðoạn mã kiểm soát lỗi
Kiểm soát ngoại lệ (1)
Trang 16Khối lệnh ñặt trong finally luôn ñược thực thi cho dù cóException hay không.
Thường dùng ñể giải phóng tài nguyên
//ðoạn mã luôn luôn ñược thực thi
Kiểm soát ngoại lệ (2)
Trang 17try {
// Khối lệnh trước dòng lệnh sinh ra lỗi
// Dòng lệnh sinh ra lỗi (Exception)
//…
}
catch (<Kiu Exception>){
// ðoạn mã kiểm soát lỗi
}
finally {
//…
Khối lệnh sau dòng lệnh sinh ra lỗi sẽ bị bỏ qua
và không thực hiện khi
có exception
Kiểm soát ngoại lệ (3)
Trang 18Kiểm soát ngoại lệ Kiểm soát ngoại lệ Ví dụ (1) Ví dụ (1)
Trang 20System.out.println(“Loi doc file”);
Kiểm soát ngoại lệ Kiểm soát ngoại lệ Ví dụ (3) Ví dụ (3)
Trang 21import java.io.*;
public class MainClass {
public static void main(String[] args) {
try {
int num_1, num_2;
BufferedReader in = new BufferedReader( new
InputStreamReader(System.in)); System.out.print( "\n Nhap so thu 1:" );
num_1 = Integer.parseInt (in.readLine());
System.out.print( "\n Nhap so thu 2:" );
num_2 = Integer.parseInt (in.readLine());
float rs = ( float )num_1/num_2;
Kiểm soát ngoại lệ Kiểm soát ngoại lệ Ví dụ (4) Ví dụ (4)
Trang 23Khi có lỗi phương thức sẽ ném ra một exception
Việc kiểm soát exception giúp chương trình kiểm soátñược những trường hợp ngoại lệ và xử lý lỗi
Dùng từ khóa throws ñể chỉ ñịnh những loại exception
mà phương thức có thể “ném” ra.
<tiền tố> <tên phương thức>(<ñối số>) throws <các
exceptions>
“Ném” ngoại lệ
Trang 24“Ném” ngoại lệ
Trong khối catch, ta có thể không xử lý trực tiếp ngoại lệ
mà lại “ném” lại ngoại lệ ñó cho nơi khác xử lý
Chú ý: Trong trường hợp trên, phương thức chứa catchphải bắt ngoại lệ hoặc khai báo throws cho ngoại lệ (nếu
là loại checked)
catch (IOException e) {
throw e;
}
Trang 25“Ném” ngoại lệ khỏi phươ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ý
Trang 26Ngoại lệ do người dùng tạo (1)
Trang 29import java.io.*; // ArrayCatch.java
class MyException extends ArrayIndexOutOfBoundsException{
int a[]= { 1,2,3,4,5}; int n=5;
public static void main(String args[]){
ArrayCatch Obj= new ArrayCatch();
Obj.OutElement(7);
}
void OutElement(int i) throws MyException{
if (i<0 || i>=n) throw new MyException();
else System.out.println (a[i]);
Ngoại lệ do người dùng tạo (4)
Trang 30Lan truyền ngoại lệ
Tình huống:
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ácphương thức ñược tạo ra
Giả sử trong C() xảy ra ngoại lệ
C() B() A() main()
B() A() main()
C() tung ngoại lệ
Trang 32Bài tập
1 Viết chương trình cho phép tính giá trị của biểu thức:
A =
Yêu cầu xử lý các ngoại lệ có thể xảy ra
2 Viết chương trình cho phép tạo một mảng 2 chiều cỡ
mxn với m, n nhập từ bàn phím Cài ñặt các xử lýngoại lệ cần thiết
5x - y
2x + 7y
Trang 333 Xây dựng lớp ngoại lệ DateException cho các lỗi về
ngày tháng
4 Viết chương trình cho phép người dùng nhập vào
ngày, tháng năm, nếu thông tin này không hợp lệ sẽtung ra một ngoại lệ DateException, sau ñó thông báocho người nhập biết và cho phép người dùng nhập lại
Bài tập
Trang 34Hỏi & ñáp