से होने वाली कोशिशों के साथ प्रयासों में आत्म-दमन त्रुटि, मुझे एक परेशानी की स्थिति में आ गया है जहां मैं जावा को शिकायत करने की उम्मीद करता हूं (Throwable.addSuppressed
से Throwable.addSuppressed
से) एक ही अपवाद को दो बार फेंकने के बारे में, एक बार कोशिश करने के भीतर- संसाधनों के ब्लॉक के साथ और 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)
हालांकि, जब मैं का निर्माण और मैं एक ही परिणाम नहीं मिलता है ग्रहण से एक ही कोड चलाने के लिए, मैं निम्नलिखित मिल:
Exception in thread "main" java.lang.RuntimeException: My Exception
at TestDoubleThrow.main(TestDoubleThrow.java:9)
मैंने आदेश पंक्ति से निर्माण के बाद .class पथ को हटा दिया ताकि यह सुनिश्चित किया जा सके कि ग्रहण ने इसे पुनर्निर्मित किया है। एक डीबगर से चल रहा मैंने देखा कि ग्रहण से कोड कभी भी java.lang.Throwable.addSuppressed()
में प्रवेश नहीं करता है।
दिलचस्प बात यह है कि, यदि मैं ग्रहण से कक्षा का निर्माण करता हूं, तो उसे कमांड लाइन से चलाएं, मैं स्वयं दमन त्रुटि नहीं देखता हूं। इसी प्रकार यदि मैं कमांड लाइन से कक्षा का निर्माण करता हूं और इसे ग्रहण से चलाता हूं (एक्लिप्स से इमारत के बिना) तो मुझे त्रुटि दिखाई देती है। इससे पता चलता है कि कक्षा के निर्माण के बारे में कुछ मजाकिया है।
मैं यह जानना चाहता हूं कि ग्रहण इस तरह से कक्षा का निर्माण कैसे कर सकता है कि मुझे त्रुटि मिलती है, क्योंकि मेरे उद्देश्यों के लिए यह एक त्रुटि है और मैं इसे बनाने और चलाने के दौरान इसे पहचानने में सक्षम होना चाहता हूं ग्रहण से।
मैंने दोनों मामलों में बाइट कोड को देखते समय एक समान चीज़ देखी। मुझे एक [जेडीके बग] (https://bugs.openjdk.java.net/browse/JDK-8042377) के रूप में चर्चा की गई बग मिली। चाहे वह एक जेडीके बग है या ग्रहण बग मेरे लिए नहीं है :) दोनों के बीच लगातार व्यवहार करना अच्छा होगा, और तथ्य ग्रहण वास्तव में कोड डालने वाला है जो थ्रोवेबल में उस महानता से नहीं है। – CoreyP