Bài 9: Sử dụng Try, catch, finally trong Java để bắt lỗi

Trước khi vào chi tiết, mình sẽ nêu 1 tình huống như này, đó là lỗi chia cho 0.
Bình thường theo các bài trước, các bạn sẽ dùng if, else để loại bỏ, in ra lỗi. (tất nhiên nếu bạn đã biết try catch rồi thì không nói :D). Đọc xong bài này, các bạn sẽ có thêm 1 cách khác, và tất nhiên nó còn sử dụng để bắt và xử lý nhiều loại lỗi hơn!

Ví dụ: Các bạn xem đoạn code này trước khi đọc lý thuyết, chạy thử nó, có thể nó cũng khá dễ hiểu!

public class JavaAndroid {
 
    public static void main(String[] args) {
        int a = 5;
        int b = 0;
 
        //Cách các bài trước thường làm, dùng if, else:
        if (b == 0) {
            System.out.println("Lỗi chia cho 0");
        } else {
            System.out.println("a/b = " + a / b);
        }
 
        System.out.println("\nCách dùng try - catch - finally \n");
 
        //Sử dụng try, catch để bắt lỗi:
        try {
            System.out.println("a/b = " + a / b);
        } catch (Exception e1) {
            System.out.println("Có lỗi gì đó xảy ra  ");
            System.out.println("Tên lỗi là: " + e1);
        } finally {
            System.out.println("Có lỗi hay không thì cái dòng cuối cùng này vẫn được in ra!");
        }
 
    }
}

1. Try – catch:

– Trong ví dụ trên, trong khối try{} là những dòng lệnh chúng ta cần thực hiện!
Khối catch (Exception e1) {} là nơi chứa các dòng lệnh thực hiện khi phát hiện lỗi!
– Ở đây, ta cần hiểu rõ khái niệm Exception:
Exception
(Ngoại lệ) là sự kiện xảy ra khi một chương trình đang chạy mà phát sinh ra lỗi. Nó sẽ làm gián đoạn chương trình!
(Exception e1) trong đó “e1” là tên của được gán nếu đối tượng bị lỗi, các bạn có thể đặt tên này bằng các từ khác.
– Bạn có thể in “e1” ra ngoài, sẽ thấy được lỗi cụ thể!
Exception là lớp cha, nó nói chung, và in ra các lỗi, ngoài ra còn có lớp con cụ thể và các ngoại lệ khác như sau:

Exception | Lớp nền của run-time
NullPointerException | Một đối tượng không tồn tại
ClassNotFoundException | Không tìm thấy Class
FileNotFoundException | Không tìm thấy file
SecurityException | Exception liên quan đến bảo mật
ArrayIndexOutOfBoundsException | Vượt quá chỉ mục của mảng
IllegalAccessException | Truy cập không hợp lệ
IllegalArgumentException | Đối số hàm
ArithmeticException | Lỗi thực thi một phép toán
NumberFormatException | Định dạng số không đúng
IOException | Lỗi nhập xuất
EOFException | Kết thúc một tập tin
NoSuchMethodException | Sai tên phương thức
InterruptedException | Ngắt luồng đang được thực thi

Ví dụ: In ra lỗi cụ thể vượt quá chỉ mục của mảng.

public class JavaAndroid {
 
    public static void main(String[] args) {
        int arrInt[] = {1, 2, 4, 7, 10};
        try {
            System.out.println("arrInt[6] = " + arrInt[6]);
 
        } catch (ArrayIndexOutOfBoundsException e2) {
            System.out.println("Lỗi! Vượt quá chỉ mục của mảng! " + e2);
        }
 
    }
}

Ngoài ra, để in nhiều Exception thì ra làm như sau:

try {
    //Nội dung muốn bẫy lỗi
} catch (ExceptionType1 e) {
    //Khối lệnh cho lỗi
}catch (ExceptionType2 e1) {
    //Khối lệnh cho lỗi
} catch (Exception ex) {
    //Exception cho những cái còn lại
}

Trong đó ExceptionType là những loại Exception cụ thể đã nêu ở phía trên!

2. Finally?

Nó nằm ở cuối cùng của khối lệnh try – catch – finally, nó luôn luôn được thực hiện ngay cả khi chương trình có bắt được lỗi
hay không!
Trong khối lệnh đầy đủ như ví dụ ở đầu bài, dòng System.out.println(“Có lỗi hay không thì cái dòng cuối cùng này vẫn được in ra!”);
Luôn luôn được thực hiện và in ra khi bạn gán bất giá trị nào cho b!

Nguyễn Linh

Chia sẻ để cùng tiến bộ...