我遇到了一个令人不安的情况,我期望Java通过从(从Throwable.addSuppressed
)投诉两次抛出相同的异常,一次从try-带有资源块和从AutoCloseable
类的关闭()例程。我已经创建了一个简单的测试用例,其中突出显示了问题。在Eclipse中尝试资源时出现异常自我压抑错误
我运行JDK 1.7.0_65用下面的代码:
public class TestDoubleThrow {
public static void main(String[] args) {
class TestA implements AutoCloseable {
RuntimeException e;
public TestA(RuntimeException e) { this.e = e; }
@Override public void close() { throw e; }
}
RuntimeException e = new RuntimeException("My Exception");
try (TestA A = new TestA(e)) {
throw e;
}
}
}
当我编译,并通过命令行我得到预期的结果运行上面的代码,一个错误,指示我试图自我抑制和异常:
[coreys terminal]$ java TestDoubleThrow.java ; java TestDoubleThrow
Exception in thread "main" java.lang.IllegalArgumentException: Self-suppression not permitted
at java.lang.Throwable.addSuppressed(Throwable.java:1043)
at TestDoubleThrow.main(TestDoubleThrow.java:12)
Caused by: java.lang.RuntimeException: My Exception
at TestDoubleThrow.main(TestDoubleThrow.java:9)
然而,当我建立并运行Eclipse的代码,我没有得到同样的结果,我得到如下:
Exception in thread "main" java.lang.RuntimeException: My Exception
at TestDoubleThrow.main(TestDoubleThrow.java:9)
我从命令行构建完成后删除了.class路径,以确保Eclipse重建它。从调试器运行我注意到,从Eclipse代码永远不会输入java.lang.Throwable.addSuppressed()
。有趣的是,如果我从Eclipse构建类,然后从命令行运行它,我不会看到自我抑制错误。同样,如果我从命令行构建类并从Eclipse运行它(无需从Eclipse构建),那么我会看到错误。这表明对于eclipse如何构建类是有趣的。
我想知道如何确保Eclipse能够以这样一种方式构建类,使得我得到错误,因为对我而言,这是一个错误,我希望能够在构建和运行时检测到它来自Eclipse。
在两种情况下查看字节码时,我都注意到了类似的情况。我发现这个bug是作为[JDK bug]在这里讨论的(https://bugs.openjdk.java.net/browse/JDK-8042377)。无论是JDK错误还是Eclipse错误都不适合我说:)在两者之间保持一致的行为会很好,事实上Eclipse实际上插入了绕过Throwable的代码并不是那么好。 – CoreyP 2014-09-03 05:30:36