Quá trình lan truyền exception trong java

Các method trong java khi chúng gọi đến nhau thì những method được gọi sau sẽ thêm vào đỉnh của stack, khi một method thực thi xong sẽ bị xoá khởi stack và thực thi method tiếp theo ở đỉnh stack. Quá trình này cứ tiếp tục cho đến khi stack rỗng.

Quá trình lan truyền exception trong unchecked exception

Trong java khi một method ném ra một unchecked exception hệ thống sẽ cố gắng tìm khối try-catch gần nhất để xử lý chúng. Nếu method hiện tại không xử lý exception, thì hệ thống sẽ xem xét đến method nằm bên dưới nó trong stack nếu vẫn không tìm thấy khối try-catch thì hệ thống sẽ tiếp tục tìm cho đến cuối stack hoặc dừng lại khi tìm thấy khối try-catch để xử lý.

Hình minh hoạ cho quá trình lan truyền exception đối với unchecked exception.

Danh sách các method trong stack được gọi là call stack và quá trình tìm kiếm khối try-catch để xử lý exception gọi là quá trình lan truyền exception.

class Simple { 
    void m() 
    { 
        int data = 50 / 0; // unchecked exception occurred 
        // exception propagated to n() 
    } 
  
    void n() 
    { 
        m(); 
        // exception propagated to p() 
    } 
  
    void p() 
    { 
        try { 
            n(); // exception handled 
        } 
        catch (Exception e) { 
            System.out.println("Exception handled"); 
        } 
    } 
  
    public static void main(String args[]) 
    { 
        Simple obj = new Simple(); 
        obj.p(); 
        System.out.println("Normal flow..."); 
    } 
}

Output:

Exception handled
Normal flow…

Trong ví dụ trên, tại method m() phát sinh ArithmeticException do dữ liệu được tính toán không hợp lệ (50/0). ArithmeticException là một unchecked exception nên quá trình lan truyền exception được tiến hànhm hệ thống sẽ tìm đến method gọi m()n() và cho đến khi gặp p() thì được xử lý. 

Quá trình lan truyền exception trong checked exception

Không giống như unchecked exception, quá trình lan truyền exception không xảy ra đối với checked exception. Chúng ta buộc phải dùng từ khoá throw để ném ra một exception trong khi unchecked thì không.

Để chuyển một checked exception cho method phía bên dưới stack xử lý bắt buộc chúng ta phải sử dụng từ khoá throws. Nếu không chúng ta bắt buộc phải try-catch để xử lý hoặc bị trình biên dịch báo lỗi.

import java.io.IOException; 
class Simple { 
  
    // exception propagated to n() 
    void m() throws IOException 
    { 
        // checked exception occurred 
        throw new IOException("device error"); 
    } 
  
    // exception propagated to p() 
    void n() throws IOException 
    { 
        m(); 
    } 
    void p() 
    { 
        try { 
  
            // exception handled 
            n(); 
        } 
        catch (Exception e) { 
            System.out.println("exception handled"); 
        } 
    } 
  
    public static void main(String args[]) 
    { 
        Simple obj = new Simple(); 
        obj.p(); 
        System.out.println("normal flow..."); 
    } 
}

Output:

Exception handled
Normal flow…

Tóm lược

Quá trình lan truyền exception chỉ xảy ra đối với unchecked exception. Còn đối với checked exception thì không tuy nhiên chúng ta cũng có thể tạo nên cơ chế tương tự với từ khoá throws. Hay đơn giản rằng unchecked exception lan truyền tự động còn checked lan truyền thủ công. 

Nguồn tham khảo

https://www.geeksforgeeks.org/exception-propagation-java/

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x