CodeGym /课程 /Java 语法 /异常工作原理

异常工作原理

Java 语法
第 9 级 , 课程 5
可用

“首先我先讲解下异常的工作原理。你可通过下例有个大致了解:”

使用异常的代码:
class ExceptionExampleOriginal
{


    public static void main(String[] args)
    {
        System.out.println("main 方法开始");
        try
        {
            System.out.println("main 调用前");

            method1();



            System.out.println("main 调用后");
        }
    catch (RuntimeException e)
        {


            String s = e.getMessage();
            System.out.println(s);
        }
        System.out.println("main 方法结束");
    }

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

        System.out.println("method1 结束");
    }

    public static void method2()
    {
      System.out.println("method2");
      String s = "消息:未知异常";
    throw new RuntimeException(s);

    }
}
过程的大概表示
public class ExceptionExample
{
 private static Exception exception = null;

   public static void main(String[] args)
    {
        System.out.println("main 方法开始");

       
        System.out.println("main 调用前");

        method1();

        if (exception == null)
        {
            System.out.println("main 调用后");
        }
        else if (exception instanceof RuntimeException)
        {
            RuntimeException e = (RuntimeException) exception; exception = null;
            String s = e.getMessage();
            System.out.println(s);
        }
        System.out.println("main 方法结束");
    }

    public static void method1()
    {
        System.out.println("method1 开始");
        method2();
        if (exception != null) return;
        System.out.println("method1 结束");
    }

    public static void method2()
    {
        System.out.println("method2");
        String s = "消息:未知异常";
        exception = new RuntimeException(s); return;
    }
}

“我完全糊涂了。”

“没关系,让我解释下这个过程。”

“在左侧的示例中,我们依次调用了一些方法。在 method2 中,我们特意创建并抛出一个异常(我们创建了一个错误)。”

“右边的例子显示了正在发生的事情。”

“看看 method2。我们并不创建异常,而是创建了 RuntimeException 对象,将其保存为 static 变量 exception,然后使用 return 语句立即退出方法。”

“在 method1 中,调用 method2 后,我们检查是否有异常。如果有异常,则 method1 立即结束。在 Java 中,每个 (!) 方法调用之后,都会间接执行这样的检查。”

“哇!”

“不错。”

“在右列中,我使用 main 方法大致显示了使用 try-catch 结构捕获异常时发生的情况。如果没有异常,那么一切将继续正常运行。如果存在异常,并且与 catch 语句中指定的类型相同,则我们将对其进行处理。”

throw instanceof 是什么意思?”

“看看最后一行:throw new RuntimeException(s);。这是创建和抛出异常的方法。我们暂时不涉及这个。这只是一个例子。”

“我们使用 a instanceof B 检查是否对象 a 是否为 B 类型,即变量异常所引用的对象是否是一个 RuntimeException。这是一个 boolean 表达式。”

“我想我明白了。差不多明白了。”

评论 (10)
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION
Harry Levis 级别 10,Aruba,Aruba
4 三月 2025
“在 method1 中,调用 method2 后,我们检查是否有异常。如果有异常,则 method1 立即结束。” “在 Java 中,每个 (!) 方法调用之后,都会间接执行这样的检查。” 这个写得太好了。 正是因为如此,所以对于调用了有可能发生异常的函数的位置,必须要求程序员要么就地try catch,指明处理方法,要么就throws,往上抛。否则在间接执行这样的检查之后,一旦出现异常,这个异常就卡在这儿没法处理了。
简默 级别 15,Central District,Hong Kong
5 十二月 2023
我想我大抵是些许糊涂了,但又完全不太明白
HOHOZ 级别 11,Australia
28 十一月 2023
我完全糊涂了。
一只小白白 级别 11,Hengyang,China
5 十一月 2022
我大抵是悟了
Bob 级别 20,伯明翰,美国
1 七月 2022
我大抵是糊涂了
阳光灿烂的日子 级别 13,中国
19 六月 2022
我想大抵是懂了些许意思,又没完全理解
zhang._ 级别 16,United States of America
29 十一月 2021
“我想我明白了。差不多明白了。”
UMKevinGe 级别 20,Nanjing,China
20 十月 2021
我们使用 a instanceof B 检查是否对象 a 是否为 B 类型,即变量异常所引用的对象是否是一个 RuntimeException。这是一个 boolean 表达式。” 这儿看不懂
婉昭 苍 级别 17,China
24 一月 2021
我想我不大明白🤯
null 级别 17,Chengdu
6 三月 2021
感觉理解就可以了,之后估计需要模仿应用