Java Exception Handling là gì? (What is Exception Handling in Java?)





Trong khi code ứng dụng trong một vài trường hợp khi biên diên dịch chương trình, hay đang xử dụng ứng dụng thì không không hoạt động, thông thường nguyên nhân là do chương trình đã xảy ra các lỗi ngoại lệ(exception).

Trong bài viết này ta sẽ phân tích về các ngoại lệ và cách xử lý các ngoại lệ.





Ngoại lệ(exception) là một sự kiện(even), xảy ra trong tiến trình thực thi của một chương trình, ngoại lệ(exception) sẽ làm ngưng tiến trình bình thường của chương trình. Nó là một lỗi được quăng ra bởi một lớp(class) hoặc một phương thức(method) báo cáo một lỗi trong mã(code).

Lớp 'Throwable' is lớp cha(supperclass) của tất các lỗi và các ngoại lệ(exceptions) trong ngôn ngữ lập trình Java.

Exceptions(các ngoại lệ) được phân loại thành 'checked exceptions'(có kiểm tra các ngoại lệ) và 'unchecked exeptions'(không kiểm tra các ngoại lệ). Tất cả RuntimeExcaptions(thời gian chạy ngoại lệ) và Erros(các lỗi) là Unchecked exceptions(không kiểm tra các ngoại lệ). Phần còn lại của exceptions thì được gọi là check exceptions. Check exceptions phải được xử lý trong các mã để tránh lỗi trong thời gian biên dịch(compile time erros).

Các ngoại lện(exceptions) có thể được xử lý bằng cách dùng 'try-catch'. Try sẽ chứa các nội dung của mã mà ta sẽ quan sát các ngoại lệ. Catch sẽ chứa các biện pháp khác phục để xử lý các lỗi ngoại lệ. Nếu bất kỳ ngoại lệ nào xảy ra trong Try thì sẽ được chuyển đến Catch để xử lý.

Trong trường hợp một phương thức không xử lý ngoại lệ(exceptions), thì nó bắt buộc phải được chỉ định kiểu ngoại lệ trong phương thức xác nhận sử dụng mệnh đề 'throws'.

Chúng ta có thể quăng một ngoại lệ một cách rõ ràng bằng cách xử dụng mệnh đề 'throws'.

Các định nghĩa và mô tả trên hơi khó hiểu phải không ^^? vì vậy như thường lệ chúng ta sẽ đi qua một số ví dụ để hiểu rõ hơn.

Đầu tiên ta sẽ đi qua ví dụ mô tả "chương trình bị ngắt tiến trình khi xảy ra một ngoại lệ" thông qua đoạn mã phía dưới.

public class ExceptionTerminatesJavaProgram
{
   
    public static void main(String[] args)
    {
        for(int i=7;i>=0;i--)
        {
            System.out.println(10/i);
        }
        System.out.println("After for loop...");
    }

}

Sau khi chạy đoạn code ta sẽ có kết quả như sau.


Nếu bạn xem đoạn code trên có thể bạn sẽ đoán ứng dụng sẽ chạy bình thường và dòng cuối cùng được in ra là "After for loop...", nhưng trong tiến trình xử lý ta gặp phải một ngoại là là "10 chia 0" điều này thì trái với nguyên tắc toán học vì chạy trình biên dịch mới quang ra lỗi và ngắt tiến trình của ứng dụng.

Kế tiếp ta sẽ bàn về vấn đề xử lý ngoại lệ phát sinh, để xử lý thông thường ta sẽ sử dụng 'try - catch', ví dụ bên dưới sẽ mô tả xử lý ngoại lệ phát sinh của ứng dụng trên.

public class ExceptionTerminatesJavaProgram
{
   
    public static void main(String[] args)
    {
        try
        {
            for(int i=7;i>=0;i--)
            {
                System.out.println(10/i);
            }
         
        }
        catch (Exception ex)
        {
            System.out.println("Exception Message: "+ex.getMessage());
            ex.printStackTrace();           
        }
        System.out.println("-- After for loop...");         
    }

}

Sau đây là kết quả.


Như bạn thấy ta sử dụng Try để theo dõi các ngoại lệ trong vòng lập For, và dùng Catch để xử lý ngoại lệ bằng cách thông báo nó ra màn hình, vì vậy tiến trình của ứng dụng vẫn hoạt động bình thường bằng chứng là  dòng "After for loop..." được in ra màn hình.

Trong trường hợp ta có thể xác định ngoại lệ có thể xảy ra cho chương trình của mình trong một phương thức nào đó, ta hoàn toàn có thể xác định và quăng ra một thông báo lỗi theo ý muốn, ví như ứng dụng sau.

public class JavaThrowsException {
   
    public static void main(String[] args) {
        try {
            JavaThrowsException jte = new JavaThrowsException();
            System.out.println("Length fo string is " + jte.getStringLength("VNLVIES.NET"));
            System.out.println("Length fo string is " + jte.getStringLength(null));   
        } catch (Exception ex) {
            System.out.println("Exception message: " + ex.getMessage());
        }

    }
   
    public int getStringLength(String str){
        return str.length();
    }
}

Kết quả sau khi chạy tay thấy ứng dụng sẽ phát sinh ra một ngoại lệ(exception) do tham số truyền vào String là giá trị NULL.


Ở đây ta nhận thấy rằng ngoại lệ này ta hoàn toàn có thể nắm bắt được vậy làm cách nào để có được một câu cảnh báo rõ ràng hơn, hoặc làm cách nào nào để xử lý ngoại lệ này trong phương thức "getStringLength", bạn hãy xem tiếp đoạn code sau.

public class JavaThrowsException {
   
    public static void main(String[] args) {
        try {
            JavaThrowsException jte = new JavaThrowsException();
            System.out.println("Length fo string is " + jte.getStringLength("VNLVIES.NET"));
            System.out.println("Length fo string is " + jte.getStringLength(null));   
        } catch (Exception ex) {
            System.out.println("Exception message: " + ex.getMessage());
        }

    }
   
    public int getStringLength(String str) throws Exception {
        if(str == null){
            throw new Exception("String input is null");
        }           
        return str.length();
    }
}

Như các bạn thấy trong đoạn code tôi sử dụng mệnh đề "throw" để xác định một ngoại lệ, và dưới đây là kết quả.


Bài viết có sơ xót gì, các bạn hỗ trợ chỉnh lý nha ^-^!
















No comments:

Post a Comment