抑制异常

问题描述 投票:0回答:1

在 Kathy Sierra 所著的《OCP Java SE 8 Programmer II》一书中,第 203 页指出:

“9.D是正确的”其中是

D。 RuntimeException c 没有抑制异常

但是当我尝试运行此代码时,输出抑制了 RuntimeException“a”的异常和 IOException 的主要异常。我错过了什么?

import java.io.Closeable;
import java.io.IOException;

public class Animals {
    class Lamb implements Closeable {
        public void close() {
            throw new RuntimeException("a");
        }
    }
    public static void main(String[] args) {
        new Animals().run();
    }
    public void run() {
        try (Lamb l = new Lamb();) {
            throw new IOException();
        } catch (Exception e) {
            throw new RuntimeException("c");
        }
    }
}

在 catch 块中添加此代码将显示抑制的异常和 IOException

    System.out.println("catch main: " + e);
    for (Throwable t : e.getSuppressed()) {
        System.out.println("catch suppressed " + t);
    }
java exception try-catch
1个回答
1
投票

是的,

close
抛出的异常被尝试结束时的异常所抑制。您可以通过检查捕获的异常来观察这一点:

public void run() {
    try (Lamb l = new Lamb();) {
        throw new IOException();
    } catch (Exception e) {
        System.out.println("catched "+e);
        for (var ex: e.getSuppressed())
            System.out.println("suppressed "+ex);
        throw new RuntimeException("c");
    }
}

其执行导致:

catched java.io.IOException
suppressed java.lang.RuntimeException: a
Exception in thread "main" java.lang.RuntimeException: c
    at Animals.run(Animals.java:20)
    at Animals.main(Animals.java:11)

教程(请参阅尝试使用资源)说:

抑制异常

可以从与该关联的代码块中抛出异常 尝试使用资源语句。 [...] 如果 try 块抛出异常 并且从 try-with-resources 抛出一个或多个异常 语句,然后是从 try-with-resources 抛出的异常 语句被抑制,块抛出的异常是 一个被抛出的[...]。你可以 通过调用来检索这些被抑制的异常 Throwable.getSuppressed 方法来自 try 抛出的异常 块。

但是从 catch 中抛出的

Runtime
没有与之关联的受抑制异常。

© www.soinside.com 2019 - 2024. All rights reserved.