java - "Self-suppression not permitted"究竟是什么?为什么 Javac 生成的代码会导致此错误?

标签 java exception java-7 try-with-resources

这个新的 Java 7 try-with-resources 结构非常好。或者至少,在出现异常并毁了我的一天之前,它很好

我终于设法将它归结为一个只使用 JUnit+jMock 的可重现测试。

@Test
public void testAddSuppressedIssue() throws Exception {
    Mockery mockery = new Mockery();
    final Dependency dependency = mockery.mock(Dependency.class);

    mockery.checking(new Expectations() {{
        allowing(dependency).expectedCall();
        allowing(dependency).close();
    }});

    try (DependencyUser user = new DependencyUser(dependency)) {
        user.doStuff();
    }
}

// A class we're testing.
private static class DependencyUser implements Closeable {
    private final Dependency dependency;

    private DependencyUser(Dependency dependency) {
        this.dependency = dependency;
    }

    public void doStuff() {
        dependency.unexpectedCall(); // bug
    }

    @Override
    public void close() throws IOException {
        dependency.close();
    }
}

// Interface for its dependent component.
private static interface Dependency extends Closeable {
    void expectedCall();
    void unexpectedCall();
}

运行这个例子,我得到:

java.lang.IllegalArgumentException: Self-suppression not permitted
    at java.lang.Throwable.addSuppressed(Throwable.java:1042)
    at com.acme.Java7FeaturesTest.testTryWithResources(Java7FeaturesTest.java:35)

阅读文档,他们似乎在说,如果您要将一个被抑制的异常添加回自身,这就是触发此错误的原因。但并没有这样做,只是在使用 try-with-resources block 。 Java 编译器 然后生成看似非法的代码,这使得该功能实际上无法使用。

当然,测试通过就没有问题了。当测试失败时,会发生异常。所以现在我已经解决了我最初发现的问题,我已经恢复使用 try-with-resources。但下次发生异常时,我宁愿异常是预期失败,而不是 Java 本身似乎没有充分理由发出。

那么...有没有办法在不放弃 try-with-resources 的情况下获得正确的错误报告?

最佳答案

看起来 jMock 从这两个方法中抛出了相同的异常实例。这就是它如何在没有 jMock 的情况下被复制:

public class Test implements Closeable {
    private RuntimeException ex = new RuntimeException();

    public void doStuff() {
        throw ex;
    }

    public void close() {
        throw ex;
    }
}

try (Test t = new Test()) {
    t.doStuff();
}

如果是这样,我认为这是 jMock 的问题,而不是 Java 编译器的问题。

关于java - "Self-suppression not permitted"究竟是什么?为什么 Javac 生成的代码会导致此错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12103126/

相关文章:

java - Spring 启用独立的 Java 库

java - Jython,从 Java 代码内部停止脚本执行

java - 客户端未连接到服务器

java - 为什么我创建的自定义异常会导致非静态变量错误?

面临异常时构造函数中的c++空闲内存分配

javac 失败并出现错误 JNU_GetStringPlatformChars : referenced symbol not found

java - 将 xml bean 中的属性提取到 java 中

python - 在多进程中处理异常

java - AES加密抛出 "Illegal Key Size error"

java - 使用Java 7 nio读写文件