【问题标题】:How does the compiler understand which exception to run below?编译器如何理解下面运行哪个异常?
【发布时间】:2021-07-31 04:34:18
【问题描述】:
    try {
        Image image = new Image("MyComputer/Documents/Photos/estambul.jpg");

        try {
            //...

            image.print();

            throw new NullPointerException();
        } finally {
            System.out.println("FINALLY");
            image.close();
            throw new IOException();
        }
    } catch (IOException ex){
        System.out.println("IO_EXCEPTION");
        System.out.println(ex.getMessage());
    }

    System.out.println("THREAD IS CONTINUE");

这里没有抛出 NullPointerException。但是,没有 catch 块可以捕获它。看起来 IOException 正在压缩 NullPointerException。你的评论是什么?没看懂。

【问题讨论】:

    标签: java exception try-catch try-catch-finally


    【解决方案1】:

    NullPointerException 不在这里抛出。

    实际上,它是……假设代码到达了您明确抛出它的语句。

    但问题是内部try 有一个finally 块。在finally 块中,您明确地抛出了IOException。这将替换原来的异常。

    行为在JLS 14.20.2 中指定。支配你的例子的文本是:

    “如果try 块的执行由于抛出一个值V 而突然完成,那么有一个选择:

    ...

    • 如果 finally 块由于原因 S 而突然完成,那么 try 语句由于原因 S 而突然完成(并且值 Vthrow 被丢弃和遗忘)。 "

    看起来IOException 正在挤压NullPointerException

    有点。但是,我们使用非正式术语 squashing 来指代捕获和忽略异常的做法。


    那么它在运行时只能处理一个异常。

    没错。在任何时间点,每个线程最多只能有一个“突然终止原因”。

    【讨论】:

    • 那么它在运行时只能处理一个异常。谢谢你的回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多