जबकि investigating a stack trace discrepancy एक और जवाब लिखते समय, मैं एक ऐसे व्यवहार में आया जो मुझे समझ में नहीं आया। निम्नलिखित परीक्षण कार्यक्रम पर विचार करें (यह जहाँ तक नीचे मैं इसे संकीर्ण सकता है के रूप में है):स्टैक ट्रेस में रहस्यमय रेखा
interface TestInterface <U> {
void test (U u);
}
static class Test <T extends Test<T>> implements TestInterface<T> { // line 11
@Override public void test (T t) {
throw new RuntimeException("My exception"); // line 13
}
}
static class TestA extends Test<TestA> { }
static class TestB extends Test<TestB> { }
public static void main (String[] args) throws Exception {
try {
Test a = new TestA();
Test b = new TestB();
a.test(b);
} catch (Exception x) {
x.printStackTrace(System.out);
}
try {
TestInterface a = new TestA();
Test b = new TestB();
a.test(b);
} catch (Exception x) {
x.printStackTrace(System.out);
}
try {
TestInterface a = new TestA();
TestInterface b = new TestB();
a.test(b);
} catch (Exception x) {
x.printStackTrace(System.out);
}
}
लाइन्स 11 और 13 से ऊपर स्निपेट में दर्शाये जाते हैं और यह run on ideone हो सकता है। उस कार्यक्रम का उत्पादन होता है:
java.lang.RuntimeException: My exception
at Ideone$Test.test(Main.java:13)
at Ideone.main(Main.java:25)
java.lang.RuntimeException: My exception
at Ideone$Test.test(Main.java:13)
at Ideone$Test.test(Main.java:11)
at Ideone.main(Main.java:33)
java.lang.RuntimeException: My exception
at Ideone$Test.test(Main.java:13)
at Ideone$Test.test(Main.java:11)
at Ideone.main(Main.java:41)
मेरा प्रश्न है: क्यों दूसरे और तीसरे टेस्ट केस के लिए स्टैक ट्रेस में लाइन 11 है? तीन परीक्षण मामलों के बीच अंतर a
और b
के घोषित प्रकार हैं।
लाइन 11 (वर्ग घोषणा लाइन) निम्नलिखित परिस्थितियों में ही मौजूद है: Test
एक अंतरफलक को लागू करता है
- हैं, और
- अपवाद इंटरफ़ेस विधि से फेंक दिया जाता है, तो और
- यदि इंटरफ़ेस एक प्रकार पैरामीटर लेता है, और
- यदि कक्षा घोषणा के प्रकार पैरामीटर में
extends Test<T>
है (लाइन 11 को शामिल नहीं किया गया है तो इसेclass Test<T>
के रूप में घोषित किया गया है), और - यदि विधि पर
Test
प्रकार के बजाय टाइप की जाती है।
कि ध्यान देने योग्य बात:
- यह निश्चित रूप से मेरी अपवाद उत्पन्न किया जा रहा है (संदेश और स्टैक ट्रेस)।
- अगर मैं अपना फेंक नहीं देता तो कोई अन्य अपवाद नहीं फेंक दिया जाता है।
- मैंने इसे ओरेकल जेडीके 1.7, और 1.8 पर विंडोज पर और 1.8 विचार पर पुन: उत्पन्न किया है। हालांकि, 1.7 में 11 के बजाय लाइन 1 पर एक स्टैक ट्रेस तत्व शामिल है (जो दोगुना अजीब है)।
यहां क्या हो रहा है? उस रेखा को स्टैक ट्रेस में कैसे समाप्त किया जा रहा है और यह क्यों नहीं दिखता है कि दोनों ऑब्जेक्ट्स Test
के रूप में घोषित किए गए हैं?
Here is the original program that prompted this, जहां java.lang.Enum
की लाइन 55 वर्तमान अगर a
Comparable
के रूप में घोषित किया जाता है लेकिन जब यह Enum
के रूप में घोषित किया जाता है मौजूद नहीं है। लाइन 55 जेडीके स्रोत में Enum
की घोषणा है, लाइन 180 स्पष्ट रूप से ClassCastException
फेंक दिया गया है।