- Ngoại lệ là các đối tượng kiểu lớp định nghĩa sẵn, biểu diễn trạng thái lỗi tự động phát sinh khi một hàm được thực hiện.
- Khi ngoại lệ nảy sinh, có 2 khả năng xử lý: bắt lỗi, cho qua.
- Lệnh xử lý ngoại lệ : try, catch, finally, throw và throws
a. Lệnh try…catch…finally
Cú pháp: try { Statement;
}
catch (Exception-Type1 Name1) {
Statement1;
} …
finally { Statementn+1;
}
Ý nghĩa:
try : định nghĩa một khối lệnh mà ngoại lệ có thể xảy ra
catch : đi kèm với try để bắt ngoại lệ. Nếu ngoại lệ xảy ra trong khối try, Java sẽ bỏ qua các lệnh còn lại trong khối try, và thực hiện thân của mệnh đề catch có kiểu ngoại lệ tương ứng
finally : thân của mệnh đề finally luôn thực hiện trước khi lệnh try kết thúc, dù có hay không có ngoại lệ
b. Mệnh đề throws
Nếu một hàm chứa lệnh (lời gọi hàm) có phát sinh ngoại lệ mà bạn không bắt lấy bằng lệnh try... catch, phải cho qua bằng cách thêm mệnh đề throws vào cuối khai báo hàm, nếu không trình biên dịch sẽ báo lỗi. :
throws Exception-Type1,Exception-Type2…
c. Lệnh throw
Cú pháp: throw Exception-Instance;
Tạo một đối tượng kiểu ngoại lệ : sử dụng tham đối trong mệnh đề catch hay tạo một đối tượng mới bằng toán tử new
Ví dụ: throw new NumberFormatException();
Ý nghĩa: Lệnh throw đưa vào khối try cho phép bạn điều khiển điều kiện phát sinh ngoại lệ. Khi gặp lệnh throw, chương trình sẽ bỏ qua các câu lệnh sau throw trong khối truy, và thực hiện thân của mệnh đề catch có kiểu ngoại lệ tương ứng
VD: Nhập họ tên không quá 25 ký tự, năm sinh từ 1980 đến 1985 import java.io.*;
class Nhap {
public static void main (String[] args) throws IOException {
BufferedReader kbd = new BufferedReader(new InputStreamReader (System.in));
String s = null;
do {
System.out.print("Nhap Ho va ten khong qua 25 ky tu: ");
s = kbd.readLine(); //phát sinh IOException
} while (s.length()>25 || s.length()==0);
System.out.println(“Ho va ten là : “+s);
while (true) {
try {
System.out.print("Nhap nam sinh : ");
s = kbd.readLine();
int ns =Integer.parseInt(s); //phát sinh NumberFormatException
if (ns<1980 || ns>1985) throw new NumberFormatException();
System.out.println("Nam sinh la : "+ns);
break;
}
catch(NumberFormatException e) {
System.out.println("Ban nhap lai nam sinh tu 1980 -1985");
}
}}}
Bài tập Thực hành:
1. Viết chương trình tính phép chia của 2 số, có xử lý lỗi ngoại lệ với trường hợp số bị chia bằng 0. Mã nguồn tham khảo
public class PhepChia {
public void chia(int so_chia, int so_bi_chia){
try {
if(so_bi_chia == 0)throw new Exception();
System.out.println(so_chia+" / "+so_bi_chia+" =
"+(so_chia/so_bi_chia)); }
catch (Exception er){
System.out.println("Gap loi: " +er);
}
finally {
System.out.println("Nhung viec can thuc hien");
}
System.out.println("Ket thuc ham chia()");
}
public static void main(String args[]){
int n = Integer.parseInt(args[0]);
int m = Integer.parseInt(args[1]);
PhepChia c = new PhepChia();
c.chia(n,m);
System.out.println("Ket thuc ham main!");
}
}
2. Viết chương trình khởi tạo mảng các phần tử ngẫu nhiên, có xử lý lỗi ngoại lệ với trường hợp số phần tử của mảng <0 hoặc truy xuất vượt quá chiều dài của mảng.