मुझे पता है कि यह एक पुराना सवाल है, लेकिन मुझे यह पसंद आया, और इस तरह, मैंने इसे अपने उत्तर देने का फैसला किया। शायद मेरी समझ यह क्यों नहीं की जा सकती है चर्चा और आपके रोचक प्रश्न के भविष्य के पाठकों में योगदान देगा।
मुझे ऑब्जेक्ट निर्माण विफल करने के उदाहरण के साथ शुरू करते हैं।
आइए कक्षा ए को परिभाषित करें, जैसे कि:
class A {
private String a = "A";
public A() throws Exception {
throw new Exception();
}
}
अब, मान लीजिए कि हम <ए> कोशिश करें ... पकड़ें ब्लॉक में टाइप ए का ऑब्जेक्ट बनाना चाहते हैं।
A a = null;
try{
a = new A();
}catch(Exception e) {
//...
}
System.out.println(a);
जाहिर है, इस कोड का आउटपुट होगा: null
।
जावा ए
का आंशिक रूप से निर्मित संस्करण क्यों नहीं लौटाता है? आखिरकार, निर्माता द्वारा विफलता विफल हो जाती है, ऑब्जेक्ट का name
फ़ील्ड पहले ही शुरू हो चुका है, है ना?
खैर, जावा ए
का आंशिक रूप से निर्मित संस्करण वापस नहीं कर सकता क्योंकि ऑब्जेक्ट सफलतापूर्वक बनाया नहीं गया था। वस्तु एक असंगत स्थिति में है, और इसलिए इसे जावा द्वारा त्याग दिया जाता है। आपका वैरिएबल ए भी शुरू नहीं हुआ है, इसे शून्य के रूप में रखा जाता है।
अब, जैसा कि आप जानते हैं, पूरी तरह से एक नई वस्तु का निर्माण करने के लिए, इसके सभी सुपर क्लास पहले शुरू किए जाने चाहिए। यदि सुपर वर्गों में से एक निष्पादित करने में असफल रहा, तो ऑब्जेक्ट की अंतिम स्थिति क्या होगी? यह निर्धारित करना असंभव है।
इस और अधिक विस्तृत उदाहरण को देखो
class A {
private final int a;
public A() throws Exception {
a = 10;
}
}
class B extends A {
private final int b;
public B() throws Exception {
methodThatThrowsException();
b = 20;
}
}
class C extends B {
public C() throws Exception { super(); }
}
जब सी
का कन्स्ट्रक्टर लागू होता है, तो B
प्रारंभ करते समय कोई अपवाद होता है, तो अंतिम int
variable का मान क्या होगा ख
?
इस प्रकार, ऑब्जेक्ट सी नहीं बनाया जा सकता है, यह फर्जी है, यह कचरा है, यह पूरी तरह से शुरू नहीं हुआ है।
मेरे लिए, यह बताता है कि आपका कोड अवैध क्यों है।