LẬP TRÌNH JAVA
Chương 4
NGOẠI LỆ
GV: Đoàn Thanh Sơn
Nội dung
Định nghĩa ngoại lệ (Exception)
Bắt giữ & xử lý ngoại lệ
Chuyển tiếp (Ném) ngoại lệ
Định nghĩa lớp Ngoại lệ mới
2/25
Định nghĩa ngoại lệ
-
Ngoại lệ (Exception): là sự kiện xuất hiện trong quá trình
thực thi của chương trình và gây phá vỡ dòng thực thi của
chương trình.
Có các nhóm ngoại lệ sau:
Checked: đọc 1 file không tồn tại. Lúc dịch java sẽ yêu
cầu phải bắt ngoại lệ.
Runtime: chia số 0. Lúc dịch java không kiểm tra. Nhưng
LTV cần tiên đoán và tự bắt ngoại lệ.
Errors: stack overflow. Ngoài kiểm soát của java và LTV.
Lúc dịch java không yêu cầu kiểm tra. CT không khôi
phục được.
3/25
Định nghĩa ngoại lệ
4/25
Định nghĩa ngoại lệ
Khi đối tượng ngoại lệ phát sinh, nó thuộc các lớp đặc thù
nhưng đều thừa kế từ gốc là lớp Exception.
Lớp Exception
2 phương thức thông dụng trong lớp Exception.
toString(): Trả về một chuỗi mô tả về Ngoại lệ.
printStackTrace(): In ra thông tin chi tiết về Ngoại lệ,
như các method gây ra ngoại lệ, dòng code xảy ra ngoại
lệ.
5/25
Định nghĩa ngoại lệ
Một số lớp ngoại lệ đặc thù gồm:
ArithmeticException: xảy ra khi Chương trình có các
lỗi đại số. VD: Chia cho 0.
NumberFormatException: Xảy ra khi thực hiện
chuyển đổi chuỗi không hợp lệ sang kiểu số.
NullPointerException: Xảy ra khi một đối tượng chưa
được khởi tạo mà đã truy cập đến thành phần của đối
tượng đó.
ArrayIndexOutOfBoundException: Xảy ra khi truy
cập đến phần tử của mảng có chỉ số bé hơn không hoặc
hoặc lớn hơn kích thước của mảng.
6/25
1.Bắt giữ & xử lý ngoại lệ
Cú pháp
try {
// Khối code gây ra ngoại lệ
}
catch(ExceptionType name) {
// Khối code xử lý ngoại lệ
}
…
catch(ExceptionType name) {…}
finally{
// Khối code giải phóng tài nguyên
}
7/25
Bắt giữ & xử lý ngoại lệ
Khối try đi kèm ít nhất 1 khối catch hoặc finally
Có thể có nhiều khối catch sau 1 khối try
Khối finally luôn được thực hiện
Nhiều khối try … catch có thể lồng nhau
8/25
Bắt giữ & xử lý ngoại lệ
public class MyException {
public static void main(String args[]){
calculate(9,0);
}
public static void calculate(int num, int i){
try{
System.out.println(num/i);
}catch(ArithmeticException e){
System.out.println("error");
}
finally{ System.out.println("finished");}
}
}
9/25
Bắt giữ & xử lý ngoại lệ
10/25
2.Chuyển tiếp ngoại lệ
Ngoại lệ được chuyển đến các phương thức gọi, cho đến khi
một bộ quản lý ngoại lệ được tìm thấy, hoặc kết thúc.
throw: Dùng để ném ra một ngoại lệ mà không xử lý trong
phương thức.
throws: Dùng đế khai báo danh sách các ngoại lệ mà phương
thức có thể ném ra
11/25
Chuyển tiếp ngoại lệ
public class MyException {
public static void main(String args[]){
try{
calculate(9,0);
}catch(ArithmeticException e){
System.out.println("error");
}finally{
System.out.println("finished");
}
}
public static void calculate(int num, int i){
if(i==0) throw new ArithmeticException();
else System.out.println(num/i);
}
}
12/25
Chuyển tiếp ngoại lệ
public class MyException {
public static void main(String args[]){
try{
calculate(9,0);
}catch(ArithmeticException e){
System.out.println("error");
}finally{
System.out.println("finished");
}
}
public static void calculate(int num, int i) throws
ArithmeticException{
System.out.println(num/i);
}
}
13/25
Chuyển tiếp ngoại lệ
void writeList() throws IOException,
ArrayIndexOutOfBoundsException {
PrintWriter out = new PrintWriter(new
FileWriter("OutFile.txt"));
for (int i = 0; i < SIZE; i++) {
out.println("Value at: " + i + " = "
+ vector.elementAt(i)); }
out.close();
}
14/25
Các loại Exception
Có 2 loại ngoại lệ
• Cần kiểm tra: trình biên dịch luôn kiểm tra xem
chúng ta có viết code xử lý các ngoại lệ này không
Ví dụ: IOException
• Không cần kiểm tra
Ngoại lệ runtime (Runtime exception)
15/25
Các loại Exception
Ví dụ về ngoại lệ cần được kiểm tra
InputStreamReader reader;
BufferedReader bufReader;
reader = new InputStreamReader(System.in);
bufReader = new BufferedReader(reader);
try {
String s = bufReader.readLine();
}
catch (IOException e) {
...
}
16/25
Định nghĩa lớp ngoại lệ
Có thể tạo 1 lớp xử lý ngoai lệ riêng bằng cách thừa kế từ lớp
Exception hoặc từ lớp con của Exception
Cú pháp
class MyException extends Exception
{
...
}
17/25
Đinh nghĩa lớp ngoại lệ
Ví dụ
public class MyException extends Exception
{
public MyException ()
{
}
public MyException (String msg)
{
super (msg);
}
}
18/25
Thảo luận
Ưu điểm của phương pháp xử lý ngoại lệ là gì?
Khi nào nên sử dụng phương pháp
• Bắt và xử lý ngoại lệ tại chỗ: try … catch
• Ném ngoại lệ lên các lớp trên: throw,throws
19/25