Bài 7: Quản lí ngoại lệ

Lê Hồng Phương phuonglh@gmail.com Khoa Toán-Cơ-Tin học Trường Đại học Khoa học Tự nhiên Hà Nội

Nội dung

● Ngoại lệ

● Xử lí ngoại lệ

● Lớp Throwable

● Ưu điểm của ngoại lệ

2012-2013 Object-Oriented Programming: Exception 2

Ngoại lệ

● Ngoại lệ (exception), là lỗi có thể phát sinh trong quá

trình thực hiện chương trình.

● Mỗi ngoại lệ cũng được mô hình hóa bởi một đối

tượng thuộc lớp Exception.

● Ví dụ, các thao tác sau đều sinh ngoại lệ: truy cập

mảng ở vị trí -1, chia cho 0.

2012-2013 Object-Oriented Programming: Exception 3

Ngoại lệ

● Khi xảy ra ngoại lệ trong một phương thức, phương thức tạo ra một đối tượng ngoại lệ và chuyển nó cho hệ thống.

● Đối tượng ngoại lệ chứa các thông tin về lỗi: kiểu lỗi,

trạng thái của chương trình khi xảy ra lỗi.

● Việc tạo ra đối tượng lỗi và chuyển nó cho hệ thống

được gọi là ném ngoại lệ.

2012-2013 Object-Oriented Programming: Exception 4

Ngoại lệ

● Khi một ngoại lệ được ném ra, hệ thống sẽ tìm đoạn

mã có nhiệm vụ xử lí ngoại lệ.

– Lập trình viên cần dự kiến trước các ngoại lệ có thể

xảy ra và cung cấp những mã xử lí phù hợp.

– Ví dụ, chương trình lấy dữ liệu người dùng nhập vào một JTextField với kì vọng là một số nguyên dương, nhưng người dùng nhập sai (nhập số âm, nhập chuỗi kí tự...)

● Đoạn mã xử lí ngoại lệ được gọi là bộ xử lí ngoại lệ

(exception handler).

2012-2013 Object-Oriented Programming: Exception 5

Xử lí ngoại lệ

● Bộ xử lí ngoại lệ có thể nằm ở

Phương thức ném ngoại lệ

phương thức khác phương thức ném ngoại lệ.

Phương thức không chứa bộ xử lí ngoại lệ

Phương thức chứa bộ xử lí ngoại lệ

● Khi xảy ra ngoại lệ, hệ thống sẽ tìm bộ xử lí ngoại lệ bằng cách lần theo ngăn xếp chứa các lời gọi phương thức, xuất phát từ phương thức ném ngoại lệ.

main()

Tìm bộ xử lí ngoại lệ thích hợp

​Gọi phương thức

2012-2013 Object-Oriented Programming: Exception 6

Xử lí ngoại lệ

● Bộ xử lí ngoại lệ có 3 thành phần

– Khối try, (các) khối catch, khối finally

● ​Khối try chứa các lệnh có thể sinh ngoại lệ.

● Các khối catch đi ngay sau khối try chứa các lệnh xử

lí ngoại lệ.

– Vì khối try có thể sinh nhiều kiểu ngoại lệ khác

nhau nên có thể có nhiều khối catch.

● Khối finally chứa các lệnh luôn được thực hiện khi đã

thực hiện hết các lệnh trong khối try.

2012-2013 Object-Oriented Programming: Exception 7

Xử lí ngoại lệ

● Trong chương trình liệt kê các số nguyên tố, trường văn bản chờ người dùng nhập vào một số nguyên dương n.

● Nếu người dùng nhập chuỗi kí tự không chuyển

được thành số, ví dụ xyz?

– Xảy ra ngoại lệ kiểu NumberFormatException

– Chương trình cần xử lí ngoại lệ này.

2012-2013 Object-Oriented Programming: Exception 8

Xử lí ngoại lệ

@Override public void actionPerformed(ActionEvent event) {

int n = 0; try {

n = Integer.parseInt(nTextField.getText());

} catch (NumberFormatException e) {

JOptionPane.showMessageDialog(PrimeNumberFrame.this,

"Number format error!", "Error", JOptionPane.ERROR_MESSAGE);

return;

} String primes = pn.listPrimeNumbers(n); resultTextArea.setText(primes);

}

2012-2013 Object-Oriented Programming: Exception 9

Xử lí ngoại lệ

● Đôi khi phương thức chứa đoạn mã có thể ném

ngoại lệ không thực hiện xử lí ngoại lệ.

● Khi đó, nó cần được khai báo các kiểu ngoại lệ có khả năng sinh ra để phương thức khác sử dụng nó thực hiện xử lí chúng.

Phương thức này có thể sinh hai kiểu ngoại lệ.

● Khai báo:

public void writeList() throws IOException,

ArrayIndexOutOfBoundsException {

// do something

}

Không cần có các khối try, catch để xử lí các ngoại lệ.

2012-2013 Object-Oriented Programming: Exception 10

Xử lí ngoại lệ

public void useWriteList() {

try {

writeList();

Xử lí ngoại lệ IOException

} catch (IOException e) {

// do something

} catch (ArrayIndexOutOfBoundsException e) {

// do something

}

}

Xử lí ngoại lệ ArrayIndexOutOfBoundsException

2012-2013 Object-Oriented Programming: Exception 11

Ném ngoại lệ

● Mọi mã nguồn đều có thể ném ngoại lệ bằng lệnh

throw.

● Java cung cấp nhiều lớp ngoại lệ khác nhau, tất cả

đều là lớp con của lớp Throwable.

● Cú pháp:

– throw someThrowableObject;

– Trong đó, someThrowableObject là đối tượng

thuộc một lớp con của lớp Throwable.

2012-2013 Object-Oriented Programming: Exception 12

Throwable

Object

Throwable

Exception

Error

...

...

RuntimeException

IllegalAccessException, NegativeArraySizeException

...

NullPointerException, ArithmeticException

2012-2013 Object-Oriented Programming: Exception 13

Ưu điểm của ngoại lệ

● Việc sử dụng ngoại lệ có một số ưu điểm sau:

– Tách các đoạn mã xử lí lỗi ra khỏi các đoạn mã thông

thường.

– Lan truyền lỗi ngược theo các lời gọi phương thức. Chỉ những phương thức quan tâm tới loại lỗi nào đó mới phải xử lí lỗi đó.

– Nhóm các kiểu lỗi khác nhau thành các khối catch.

● Những ưu điểm này giúp chương trình dễ đọc, dễ phát

triển hơn.

2012-2013 Object-Oriented Programming: Exception 14