我遇到了一个令人不安的情况,我希望 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 构建和运行时检测到它。