क्यों int संख्या = Integer.getInteger ("123") NullPointerException को फेंकती है?


106

निम्नलिखित कोड फेंकता है NullPointerException:

int num = Integer.getInteger("123");

क्या मेरा संकलक getIntegerअशक्त होने के बाद से अशक्त है? इसका कोई मतलब नहीं है!

क्या हो रहा है?


3
इसके बजाय Integer.getValue () का उपयोग करें। यह ब्लॉग पोस्ट एक अच्छा स्पष्टीकरण है
प्राणशर्मा

जवाबों:


212

बड़ी तस्वीर

यहाँ खेलने में दो मुद्दे हैं:

  • 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। अंत में, जब आपका प्रोग्राम आदिम मूल्यों को बॉक्स करता है, तो इसका परिणाम महंगा और अनावश्यक ऑब्जेक्ट क्रिएशन हो सकता है।

ऐसी जगहें हैं जहां आपके पास बॉक्सिंग प्राइमेटिक्स का उपयोग करने के अलावा कोई विकल्प नहीं है, जैसे कि जेनेरिक, लेकिन अन्यथा आपको गंभीरता से विचार करना चाहिए कि क्या बॉक्सेड प्राइमेटिव्स का उपयोग करने का निर्णय उचित है।

संबंधित सवाल


11
तो Integer.getInteger(s)लगभग बराबर है Integer.parseInt(System.getProperty(s))? मुझे लगता है कि मैं दूसरे को पसंद करता हूं, भले ही यह अधिक क्रिया है, क्योंकि यह इस तथ्य को उजागर करता है कि आप सिस्टम गुणों से जानकारी खींच रहे हैं।
मेट्रिक्सफ्रॉग

5
जैसे ही मैंने उस टिप्पणी को पोस्ट किया, मुझे एहसास हुआ कि मैं सिर्फ इंटेगर क्लास के वास्तविक स्रोत को देख सकता हूं! मैं सही रास्ते पर था, सिवाय इसके कि इसका उपयोग करता Integer.decodeहै Integer.parseInt, जो क्रमशः एक अग्रणी 0xया 0संख्या को हेक्साडेसिमल या ऑक्टल के रूप में देखता है।
मेट्रिक्सफ्रॉग

जो पूछ रहे हैं उनके लिए क्यों NullPointerException? : programmers.stackexchange.com/questions/158908/…
ROMANIA_engineer

2
@Oracle क्या आप java.lang.Integer.getInteger (स्ट्रिंग) को चित्रित कर सकते हैं?
मैजगार्ड


6

कृपया विधि getInteger () की जाँच करें । इस विधि में, Stringपैरामीटर एक सिस्टम गुण है जो निर्दिष्ट नाम के साथ सिस्टम प्रॉपर्टी के पूर्णांक मान को निर्धारित करता है। "123" किसी भी सिस्टम संपत्ति का नाम नहीं है, जैसा कि यहां चर्चा की गई है । यदि आप इस स्ट्रिंग को रूपांतरित करना चाहते हैं int, तो इस विधि का उपयोग करें int num = Integer.parseInt("123")

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.