Xử lý ngoại lệ trong java (Bài 4)
Xử lý ngoại lệ trong java có thể sử dụng khối try-catch, có thể sử dụng final trong khối try…catch hoặc sử dụng từ khoá throws. Sử dụng cách nào để xử lý ngoại lệ trong java còn tuỳ thuộc vào từng tình huống.
Xử lý ngoại lệ trong java – Tổng quan về ngoại lệ
Ngoại lệ là gì (Exception)
Có những lỗi chỉ khi chạy chúng mới xuất hiện và chương trình đang chạy lập tức ngừng lại và xuất hiện thông báo lỗi – đó chính là ngoại lệ (exception).
Ví dụ: Chương trình chia 2 số. Nếu ta cho mẫu số =0 thì phát sinh lỗi và đó được coi là 1 ngoại lệ.
Cơ bản về ngoại lệ
Có nhiều ngoại lệ là lớp con của lớp Exception
- RuntimeErrorException là lớp con của lớp Exception
- RuntimeErrorException là các ngoại lệ chỉ xảy khi chạy chương trình.
Người lập trình có thể tự tạo các class kế thừa từ class Exception.
Ngoại lệ ‘unchecked’: Là các ngoại lệ không cần phải ‘catch’ khi viết mã
Ngoại lệ ‘checked’: Là các ngoại lệ phải được ‘catch’ khi viết mã
Xử lý ngoại lệ trong java – Sử dụng khối try… catch để xử lý ngoại lệ
try {
//Khối lệnh có thể phát sinh ngoại lệ
} catch (Tên_Ngoại_lệ Tên_Đối_Tượng) {
//Khối lệnh xử lý khi có ngoại lệ
}
Ví dụ không sử dụng try…catch
c = a/b;
System.out.println("Sau phep chia !");(*)
Câu lệnh (*) sẽ không được thực hiện nếu mẫu số b=0, chương trình lập tức ngừng lại và xuất hiện thông báo lỗi của hệ thống
Ví dụ sử dụng khối try… catch để xử lý ngoại lệ
try {
c = a/b;
} catch(Exception e) {
System.out.println("Có lỗi "+e);
}
System.out.println("Sau phép chia !"); (*)
Câu lệnh (*) sẽ luôn được thực hiện dù mẫu số b bằng 0 hay b khác 0.
Dùng try có nhiều catch
Trong một đoạn code có thể có nhiều ngoại lệ xảy ra nên ta sẽ dùng nhiều catch để xử lý các ngoại lệ đó.
Các lệnh catch thường được viết theo thứ tự xuất hiện của ngoại lệ.
Chú ý: Tất cả các ngoại lệ sẽ là lớp con của class Exception nên catch cuối cùng sẽ là Exception.
Ví dụ 1: Ngoại lệ xảy ra khi chia cho số 0 và sai chỉ số mảng
public class SampleException1 {
public static void main (String args[]) {
try {
int b = 0;
int a = 5 / b;
int arr[] = {1, 2};
arr[3] = 10;
System.out.println("a = " + a);
} catch (ArithmeticException ae) { // (1)
System.out.println("Phep chia cho 0: " + ae);
} catch (Exception e) { // (2)
System.out.println("Co loi: " + e);
}
}
}
Nếu xuất hiện ngoại lệ phép chia cho 0 thì lệnh (1) sẽ xử lý, còn các ngoại lệ khác sẽ được xử lý bởi lệnh (2). Nếu đặt (2) đổi chỗ cho (1) thì (2) sẽ xử lý luôn ngoại lệ chia cho 0 vì như thế không cần (1) nữa. Vì thế không thể thay đổi vị trí giữa lệnh (1) và lệnh (2).
Ví dụ 2: Khối try…catch lồng nhau
public class SampleException2 {
public static void main (String args[]) {
try {
int a = 2; // cho a = 0 hoặc a = 1 để test
int b = 42 / a;
System.out.println("Ket qua cua phep chia la " + b);
try {
if(a == 1) {
a = a / (a - a);
}
if(a == 2) {
int c[] = {10};
c[5] = 17;
}
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Vuot qua chi so mang");
}
} catch (ArithmeticException ae) {
System.out.println("Phep chia cho 0");
}
}
}
Lưu ý sử dụng khối try… catch để xử lý ngoại lệ
Trong khối finally sẽ chứa một khối mã sẽ thực hiện sau khối try/catch. Khối finally sẽ được thực hiện dù ngoại lệ có xuất hiện hay không. Tuy nhiên, mỗi try sẽ yêu cầu có ít nhất 1 catch hoặc 1 finally.
Ví dụ: Xử lý ngoại lệ có finally
import java.io.FileWriter;
import java.io.IOException;
/**
*
* @author giasutinhoc.vn
*/
public class SampleException3 {
public static void main(String args[]) {
FileWriter fw = null;
try {
fw = new FileWriter("data.txt");
fw.write("Xu ly ngoai le trong java");
} catch (IOException ie) {
System.out.println("Loi ghi file: " + ie);
} finally {
try {
if (fw != null) {
fw.close();
}
} catch (IOException ioe) {
System.out.println("Loi dong: " + ioe);
}
}
}
}
Xử lý ngoại lệ trong java – Sử dụng từ khóa throws
Từ khóa throws được sử dụng trong phương thức dùng để đề xuất các ngoại lệ có thể xảy ra trong phương thức đó. Có những phương thức sử dụng một số lệnh mà các lệnh đó có thể xảy ra ngoại lệ ‘checked’ nên chúng ta bắt buộc phải xử lý ngoại lệ đó.
Ví dụ khi xử lý các lệnh thao tác với file, phải xử lý ngoại lệ ‘checked’ FileNotFoundException. Tất cả các ngoại lệ được khai báo bởi throws đều phải được xử lý, nếu không có đủ sẽ bị thông báo lỗi.
Ví dụ: Xử lý ngoại lệ khi ghi file
public class SampleException4 {
public void writeFile() throws IOException {
FileWriter fw = new FileWriter("data.txt");
fw.write("Xu ly ngoai le trong java");
fw.close();
}
public static void main(String args[]) {
try {
SampleException5 se5 = new SampleException5();
se5.writeFile();
} catch (IOException ioe) {
System.out.println("Co loi ghi file: "+ ioe);
}
}
}
Xử lý ngoại lệ trong java – Tự tạo exception
Chúng ta có thể tự viết class xử lý ngoại lệ của riêng mình bằng cách kế thừa class Exception của Java
Cú pháp:
public class Tên_Exception extends Exception {
@override
public String toString() {
Viết xử lý
}
}
Ví dụ: Tạo MyException.java
public class MyException extends Exception {
private int ex;
public MyException(int num) {
ex = num;
}
@override
public String toString() {
return "My exception " + ex;
}
}
Ví dụ: Sử dụng MyException
public class SampleException5 {
static void tinhToan(int a) throws MyException {
if(a > 10) {
throw new MyException(a);
}
}
public static void main(String args[]) {
try {
tinhToan(2); //Không tạo ra ngoại lệ
tinhToan(20); //Tạo ra ngoại lệ
} catch (MyException me) {
System.out.println("Loi: " + me);
}
}
}
Xử lý ngoại lệ trong java – Thực hành
Tạo package tên exception và tạo class tên SinhVien có các thuộc tính như mã sinh viên, họ tên, điểm, xếp loại
Tiêu chí xếp loại dựa vào điểm
- Nếu điểm >= 8 thì xếp loại giỏi
- Điểm > = 7 thì xếp loại khá
- Điểm >= 5 thì xếp loại trung bình
- Điểm < 5 thì xếp loại kém
Một số yêu cầu khác
- Viết các setter, getter, constructor, toString.
- Nhập dữ liệu cho sinh viên từ bàn phím. Viết code xử lý nhập dữ liệu hợp lệ. Nếu nhập sai kiểu dữ liệu thì thông báo lỗi và yêu cầu nhập lại. Ví dụ nhập điểm là 10a thì chương trình sẽ hiển thị thông báo “Bạn phải nhập dữ liệu là kiểu số”
- In thông tin sinh viên ra màn hình.