एक सामान्य this
कभी भी null
वास्तविक जावा कोड 1 में नहीं हो सकता है , और आपका उदाहरण एक सामान्य का उपयोग करता है this
। अधिक जानकारी के लिए अन्य उत्तर देखें।
एक योग्य this
चाहिए कभी नहीं हो null
, लेकिन इस तोड़ने के लिए संभव है। निम्नलिखित को धयान मे रखते हुए:
public class Outer {
public Outer() {}
public class Inner {
public Inner() {}
public String toString() {
return "outer is " + Outer.this; // Qualified this!!
}
}
}
जब हम एक उदाहरण बनाना चाहते हैं Inner
, तो हमें यह करने की आवश्यकता है:
public static void main(String[] args) {
Outer outer = new Outer();
Inner inner = outer.new Inner();
System.out.println(inner);
outer = null;
inner = outer.new Inner(); // FAIL ... throws an NPE
}
आउटपुट है:
outer is Outer@2a139a55
Exception in thread "main" java.lang.NullPointerException
at Outer.main(Outer.java:19)
यह दर्शाता है कि इसके संदर्भ के Inner
साथ बनाने का हमारा प्रयास विफल रहा है।null
Outer
वास्तव में, यदि आप "शुद्ध जावा" लिफाफे के भीतर रहते हैं, तो आप इसे नहीं तोड़ सकते।
हालांकि, प्रत्येक Inner
उदाहरण में एक छिपा हुआ final
सिंथेटिक क्षेत्र (कहा जाता है "this$0"
) जिसमें संदर्भ का संदर्भ होता है Outer
। यदि आप वास्तव में मुश्किल हैं, तो null
क्षेत्र में असाइन करने के लिए "गैर-शुद्ध" साधनों का उपयोग करना संभव है ।
- आप
Unsafe
इसे करने के लिए उपयोग कर सकते हैं ।
- आप इसे करने के लिए मूल कोड (जैसे JNI) का उपयोग कर सकते हैं।
- आप इसे प्रतिबिंब का उपयोग करके कर सकते हैं।
किसी भी तरह से आप इसे करते हैं, अंतिम परिणाम यह है कि Outer.this
अभिव्यक्ति null
2 का मूल्यांकन करेगी ।
संक्षेप में, एक योग्य होना संभवthis
है null
। लेकिन यह असंभव है यदि आपका कार्यक्रम "शुद्ध जावा" नियमों का पालन करता है।
1 - मैं हाथ से बाईटकोड को "लिखने" और असली जावा के रूप में उन्हें पास करने के लिए ट्रिक को छूट देता हूं, बीसीईएल या इसी तरह का उपयोग करके बायटेकोड्स को ट्वीक कर रहा हूं, या सहेजे गए रजिस्टरों के साथ देशी कोड और डूडलिंग में जा रहा हूं। IMO, यह जावा नहीं है। हाइपोथेटिक रूप से, इस तरह की चीजें जेवीएम बग के परिणामस्वरूप भी हो सकती हैं ... लेकिन मुझे बग रिपोर्ट देखकर हर याद नहीं है।
2 - वास्तव में, जेएलएस यह नहीं कहता है कि व्यवहार क्या होगा, और यह अन्य बातों के अलावा कार्यान्वयन पर निर्भर हो सकता है।