"Tôi muốn nói với bạn một chút về cách hoạt động của các ngoại lệ . Ví dụ bên dưới sẽ cho bạn ý tưởng sơ bộ về những gì sẽ xảy ra:"

Mã sử ​​dụng ngoại lệ:
class ExceptionExampleOriginal
{


    public static void main(String[] args)
    {
        System.out.println("main begin");
        try
        {
            System.out.println("main before call");

            method1();



            System.out.println("main after call");
        }
        catch (RuntimeException e)
        {


            String s = e.getMessage();
            System.out.println(s);
        }
        System.out.println("main end");
    }

    public static void method1()
    {
        System.out.println("method1 begin");
        method2();

        System.out.println("method1 end");
    }

    public static void method2()
    {
      System.out.println("method2");
      String s = "Message: Unknown Exception";
      throw new RuntimeException(s);

    }
}
Đại diện gần đúng của những gì xảy ra
public class ExceptionExample
{
    private static Exception exception = null;

   public static void main(String[] args)
    {
        System.out.println("main begin");

       
        System.out.println("main before call");

        method1();

        if (exception == null)
        {
            System.out.println("main after call");
        }
        else if (exception instanceof RuntimeException)
        {
            RuntimeException e = (RuntimeException) exception;
            exception = null;
            String s = e.getMessage();
            System.out.println(s);
        }
        System.out.println("main end");
    }

    public static void method1()
    {
        System.out.println("method1 begin");
        method2();
        if (exception != null) return;
        System.out.println("method1 end");
    }

    public static void method2()
    {
        System.out.println("method2");
        String s = "Message: Unknown Exception";
        exception = new RuntimeException(s);
        return;
    }
}

"Tôi hoàn toàn bị mất."

"Được rồi. Để tôi giải thích chuyện gì đang xảy ra."

"Trong ví dụ bên trái, chúng tôi gọi một vài phương thức liên tiếp. Trong method2, chúng tôi cố ý tạo và đưa ra một ngoại lệ (chúng tôi tạo ra lỗi)."

"Ví dụ bên phải cho thấy điều gì đang xảy ra."

"Hãy nhìn xem method2. Thay vì tạo một ngoại lệ, chúng ta tạo một RuntimeExceptionđối tượng, lưu nó vào biến tĩnh exception, rồi thoát khỏi phương thức ngay lập tức bằng cách sử dụng một returncâu lệnh."

"Trong method1, sau khi gọi method2, chúng tôi kiểm tra xem có ngoại lệ hay không. Nếu có ngoại lệ, thì method1kết thúc ngay lập tức. Việc kiểm tra như thế này được thực hiện gián tiếp sau mỗi lần gọi phương thức (!) trong Java."

"Ồ!"

"Oa nói đúng."

"Ở cột bên phải, tôi đã sử dụng phương pháp chính để hiển thị gần đúng điều gì sẽ xảy ra khi một ngoại lệ bị bắt bằng cách sử dụng cấu trúc try-catch. Nếu không có ngoại lệ, thì mọi thứ sẽ tiếp tục chạy như mong đợi. Nếu có một ngoại lệ và nó là cùng loại được chỉ định trong câu lệnh bắt, sau đó chúng tôi xử lý nó."

"Làm gì throw instanceof có nghĩa là gì? "

"Hãy nhìn vào dòng cuối cùng: throw new RuntimeException(s);. Đây là cách bạn tạo và đưa ra một ngoại lệ. Chúng tôi sẽ chưa làm việc đó. Đây chỉ là một ví dụ."

"Chúng tôi sử dụng a instanceof Bđể kiểm tra xem đối tượng acó thuộc loại hay không B, tức là liệu đối tượng được tham chiếu bởi biến ngoại lệ có phải là RuntimeException hay không. Đây là một biểu thức boolean."

"Tôi nghĩ tôi hiểu rồi. Gần như vậy."