समस्या यह है कि String.valueOf
विधि अतिभारित है :
जावा विशिष्टता भाषा में कहा गया है कि इस तरह के मामलों में, सबसे विशिष्ट अधिभार चुना जाता है:
यदि एक से अधिक सदस्य विधि दोनों पहुँच योग्य है और विधि मंगलाचरण के लिए लागू है, तो रन-टाइम विधि प्रेषण के लिए विवरणक प्रदान करने के लिए किसी एक को चुनना आवश्यक है। जावा प्रोग्रामिंग भाषा उस नियम का उपयोग करती है जिसे सबसे विशिष्ट विधि चुना जाता है।
ए char[]
- ए हैObject
, लेकिन सभी ए - ए नहीं Object
है char[]
। इसलिए, char[]
है और अधिक विशिष्ट से Object
, और के रूप में जावा भाषा द्वारा निर्दिष्ट, String.valueOf(char[])
अधिभार इस मामले में चुना जाता है।
String.valueOf(char[])
सरणी को गैर- होने की उम्मीद है null
, और जब null
से इस मामले में दिया जाता है, तब यह फेंकता है NullPointerException
।
आसान "फिक्स" निम्नानुसार null
स्पष्ट Object
रूप से डालना है:
System.out.println(String.valueOf((Object) null));
// prints "null"
संबंधित सवाल
कहानी का नैतिक
कई महत्वपूर्ण हैं:
- प्रभावी जावा 2 संस्करण, आइटम 41: विवेकपूर्ण तरीके से ओवरलोडिंग का उपयोग करें
- सिर्फ इसलिए कि आप ओवरलोड कर सकते हैं, इसका मतलब यह नहीं है कि आपको हर बार करना चाहिए
- वे भ्रम पैदा कर सकते हैं (खासकर अगर तरीके बेतहाशा अलग-अलग काम करते हैं)
- अच्छी IDE का उपयोग करके, आप जांच सकते हैं कि संकलन के समय कौन सा अधिभार चुना गया है
- ग्रहण के साथ, आप उपरोक्त अभिव्यक्ति पर माउस-होवर कर सकते हैं और देख सकते हैं कि वास्तव में ,
valueOf(char[])
अधिभार का चयन किया गया है!
- कभी-कभी आप स्पष्ट रूप से कास्ट करना चाहते हैं
null
(उदाहरण के लिए)
यह सभी देखें
कास्ट करने पर null
कम से कम दो स्थितियां हैं जहां null
विशिष्ट संदर्भ प्रकार के लिए स्पष्ट रूप से कास्टिंग आवश्यक है:
- ओवरलोडिंग का चयन करने के लिए (जैसा कि ऊपर दिए गए उदाहरण में दिया गया है)
null
एक वार्ग पैरामीटर के लिए एकल तर्क के रूप में देने के लिए
उत्तरार्द्ध का एक सरल उदाहरण निम्नलिखित है:
static void vararg(Object... os) {
System.out.println(os.length);
}
फिर, हमारे पास निम्नलिखित हो सकते हैं:
vararg(null, null, null); // prints "3"
vararg(null, null); // prints "2"
vararg(null); // throws NullPointerException!
vararg((Object) null); // prints "1"
यह सभी देखें
संबंधित सवाल
null
इस मामले में) पर बुलाया जा सकता है , तो सुनिश्चित करें कि दोनों अधिभार उस मूल्य के संबंध में एक ही कार्य करते हैं!