我遇到了一个令人不安的情况,我希望Java抱怨(通过IllegalArgumentException
from Throwable.addSuppressed
)两次抛出相同的异常,一次来自try-with-resources块,一次来自AutoCloseable
类的close()例程.我在下面创建了一个简单的测试用例,突出了问题.
我使用以下代码运行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构建和运行时检测它.