निम्नलिखित कोड फेंकता है NullPointerException
:
int num = Integer.getInteger("123");
क्या मेरा संकलक getInteger
अशक्त होने के बाद से अशक्त है? इसका कोई मतलब नहीं है!
क्या हो रहा है?
निम्नलिखित कोड फेंकता है NullPointerException
:
int num = Integer.getInteger("123");
क्या मेरा संकलक getInteger
अशक्त होने के बाद से अशक्त है? इसका कोई मतलब नहीं है!
क्या हो रहा है?
जवाबों:
यहाँ खेलने में दो मुद्दे हैं:
Integer getInteger(String)
जैसा आप सोचते हैं वैसा नहीं करता
null
इस मामले में लौटता हैInteger
करने के लिए int
कारण बनता है ऑटो unboxing
Integer
है null
, NullPointerException
फेंका हुआ हैपार्स करने के लिए (String) "123"
करने के लिए (int) 123
, आप जैसे उपयोग कर सकते हैं int Integer.parseInt(String)
।
Integer
एपीआई संदर्भInteger.getInteger
इस पद्धति के बारे में दस्तावेज़ीकरण का क्या कहना है:
public static Integer getInteger(String nm)
: निर्दिष्ट नाम के साथ सिस्टम गुण का पूर्णांक मान निर्धारित करता है। यदि निर्दिष्ट नाम के साथ कोई संपत्ति नहीं है, यदि निर्दिष्ट नाम खाली है याnull
, या यदि संपत्ति में सही संख्यात्मक प्रारूप नहीं है, तोnull
वापस कर दिया जाता है।
दूसरे शब्दों में, इस विधि का String
किसी int/Integer
मान के पार्स करने से कोई लेना- देना नहीं है, बल्कि इसे System.getProperty
विधि से करना है ।
बेशक यह काफी हैरान करने वाला हो सकता है। यह दुर्भाग्यपूर्ण है कि पुस्तकालय में इस तरह का आश्चर्य है, लेकिन यह आपको एक मूल्यवान सबक सिखाता है: हमेशा इस बात की पुष्टि करने के लिए प्रलेखन देखें कि एक विधि क्या करती है।
संयोगवश, इस समस्या का एक बदलाव रिटर्न ऑफ द पूजर्स: श्लोक एंड अवे (टीएस -5186 ) , जोश बलोच और नील गेयर की 2009 की जावा तकनीकी सत्र प्रस्तुति में चित्रित किया गया था । यहाँ निष्कर्ष स्लाइड है:
सीख
- पुस्तकालयों में अजीब और भयानक तरीके लर्क
- कुछ के नाम मासूम लग रहे हैं
- यदि आपका कोड दुर्व्यवहार करता है
- सुनिश्चित करें कि आप सही तरीके से कॉल कर रहे हैं
- लाइब्रेरी डॉक्यूमेंटेशन पढ़ें
- एपीआई डिजाइनरों के लिए
- कम से कम विस्मय के सिद्धांत का उल्लंघन न करें
- अमूर्त पदानुक्रम का उल्लंघन न करें
- बेतहाशा अलग व्यवहार के लिए समान नामों का उपयोग न करें
पूर्णता के लिए, इन पद्धतियों के भी अनुरूप हैं Integer.getInteger
:
अन्य मुद्दा, निश्चित रूप से, कैसे NullPointerException
फेंका जाता है। इस मुद्दे पर ध्यान केंद्रित करने के लिए, हम इस प्रकार स्निपेट को सरल बना सकते हैं:
Integer someInteger = null;
int num = someInteger; // throws NullPointerException!!!
यहाँ प्रभावी जावा 2 संस्करण से एक उद्धरण है, आइटम 49: बॉक्सिंग आदिम के लिए आदिम प्रकार को प्राथमिकता दें:
सारांश में, जब भी आपके पास विकल्प हो, तो बॉक्सिंग आदिम के लिए प्राथमिकताओं का उपयोग करें। आदिम प्रकार सरल और तेज हैं। यदि आप बॉक्सिंग आदिम का उपयोग करना चाहिए, सावधान! ऑटोबॉक्सिंग बॉक्सिंग प्राइमेटिक्स के उपयोग की क्रिया को कम करता है, लेकिन खतरे को कम नहीं करता है। जब आपका प्रोग्राम
==
ऑपरेटर के साथ दो बॉक्सिंग प्रिमिटिव्स की तुलना करता है, तो यह एक पहचान तुलना करता है, जो लगभग निश्चित रूप से आप क्या चाहते हैं। जब आपका प्रोग्राम बॉक्सिंग और अनबॉक्स किए गए प्राइमिटिव से मिश्रित-प्रकार की संगणना करता है, तो यह अनबॉक्सिंग करता है, और जब आपका प्रोग्राम अनबॉक्सिंग करता है, तो यह फेंक सकता हैNullPointerException
। अंत में, जब आपका प्रोग्राम आदिम मूल्यों को बॉक्स करता है, तो इसका परिणाम महंगा और अनावश्यक ऑब्जेक्ट क्रिएशन हो सकता है।
ऐसी जगहें हैं जहां आपके पास बॉक्सिंग प्राइमेटिक्स का उपयोग करने के अलावा कोई विकल्प नहीं है, जैसे कि जेनेरिक, लेकिन अन्यथा आपको गंभीरता से विचार करना चाहिए कि क्या बॉक्सेड प्राइमेटिव्स का उपयोग करने का निर्णय उचित है।
Integer.getInteger(s)
लगभग बराबर है Integer.parseInt(System.getProperty(s))
? मुझे लगता है कि मैं दूसरे को पसंद करता हूं, भले ही यह अधिक क्रिया है, क्योंकि यह इस तथ्य को उजागर करता है कि आप सिस्टम गुणों से जानकारी खींच रहे हैं।
Integer.decode
है Integer.parseInt
, जो क्रमशः एक अग्रणी 0x
या 0
संख्या को हेक्साडेसिमल या ऑक्टल के रूप में देखता है।
NullPointerException
? : programmers.stackexchange.com/questions/158908/…
से http://konigsberg.blogspot.com/2008/04/integergetinteger-are-you-kidding-me.html :
getInteger 'निर्दिष्ट नाम के साथ सिस्टम प्रॉपर्टी के पूर्णांक मान को निर्धारित करता है।'
आप यह चाहते हैं:
Integer.parseInt("123")
कृपया विधि getInteger () की जाँच करें । इस विधि में, String
पैरामीटर एक सिस्टम गुण है जो निर्दिष्ट नाम के साथ सिस्टम प्रॉपर्टी के पूर्णांक मान को निर्धारित करता है। "123" किसी भी सिस्टम संपत्ति का नाम नहीं है, जैसा कि यहां चर्चा की गई है । यदि आप इस स्ट्रिंग को रूपांतरित करना चाहते हैं int
, तो इस विधि का उपयोग करें
int num = Integer.parseInt("123")
।