IllegalArgumentException
Java が ( fromを介して)Throwable.addSuppressed
同じ例外を 2 回スローすることを期待するという厄介AutoCloseable
な状況に遭遇しました。問題を強調する以下の簡単なテスト ケースを作成しました。
次のコードで 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がエラーを取得できるようにクラスをビルドできるようにする方法を知りたいです。