java Android पर Integer.parseInt और NumberFormatException




(4)

यह एक जावा-विशिष्ट मुद्दा है। जैसा कि आप दस्तावेज़ में देखते हैं, जावा 6 अनुमति देता है - और docs + या - अनुमति देता है।

Android संस्करण 19 (किटकैट) के साथ जावा 7 समर्थित है, इसलिए आपको यह त्रुटि नहीं मिलती है। मैं अनुशंसा करता हूं कि आप + का उपयोग न करें, क्योंकि आपके पास नकारात्मक पूर्णांक होने पर केवल एक संकेत की आवश्यकता होती है।

मैंने अपने एंड्रॉइड ऐप में निम्न कोड चलाया

Integer.parseInt("+91");

एंड्रॉइड 5.0 (लॉलीपॉप) में, उसने कोई अपवाद नहीं फेंका क्योंकि +91 पूर्णांक है। लेकिन एंड्रॉइड 4.4.x (किटकैट) और निचले संस्करणों में यह फेंकता है:

NumberFormatException: अमान्य Int: "+91"

एंड्रॉइड का संस्करण इस अंतर को कैसे पैदा कर रहा है?


इस टिप्पणी में स्पष्ट + लिए समर्थन जोड़ा गया था:

Support explicit + in Byte, Short, Integer, Long.

Bug: 5239391
Change-Id: I2b25228815d70d570d537db0ed9b5b759f25b5a3

जिसे android-5.0.0_r1 शुरू किया गया है। यदि आपने गिट रिपॉजिटरी प्राप्त की है, तो आप इसके साथ सत्यापित कर सकते हैं:

git tag --contains 6b40837ee3a023bba698c38fd6d6e46ae0065a55

जो आपको देता है

android-5.0.0_r1
android-5.0.0_r2
android-5.0.0_r3
...

भले ही दस्तावेज़ीकरण इस बात की जानकारी दे सके कि परिवर्तन क्यों किया गया था (अन्य उत्तरों के रूप में जावा 7 व्यवहार को प्राप्त करने के लिए), स्रोत कोड के इतिहास का विश्लेषण व्यवहार को बदलने के लिए सबसे सटीक उत्तर देता है, क्योंकि प्रलेखन जरूरी कार्यान्वयन से मेल नहीं खाता है ।


यह व्यवहार वास्तव में जावा 7 का हिस्सा है, docs स्थिति के रूप में:

हस्ताक्षर किए गए दशमलव पूर्णांक के रूप में स्ट्रिंग तर्क को पार्स करता है। स्ट्रिंग के वर्ण सभी दशमलव अंक होने चाहिए, सिवाय इसके कि पहला वर्ण एक ASCII ऋण चिह्न हो सकता है '-' ('\ u002D') एक नकारात्मक मान या ASCII प्लस चिह्न '+' ('' u002B ') को इंगित करने के लिए। एक सकारात्मक मूल्य इंगित करने के लिए।

हालांकि , जावा 6 में केवल - प्रतीक को स्वीकार किया गया था।

Android SDK 21+ में JDK7 निर्भरताएं हैं, जो संभवतः इस व्यवहार को अनुभव कर रही हैं।


यह जावा 7 के बाद काम करता है।

एंड्रॉइड 5 जावा 7 संस्करण की तरह नए पार्सइंट फीचर को पेश करता है - मार्टिन नॉर्डहोलट्स का उत्तर बिल्कुल संशोधन करता है

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

किटकैट ने एंड्रॉइड sdk 19 में कुछ जावा 7 फीचर पेश किए, लेकिन नए पार्सइंट नहीं। निचले संस्करण parseInt (Java 6 के संस्करण) के पहले के कार्यान्वयन का उपयोग करते हैं, इसलिए वे स्पष्ट रूप से विफल हो जाएंगे।

ParseInt कार्यान्वयन के बीच अंतर: जावा 6 parseInt प्रलेखन बनाम जावा 7 parseInt प्रलेखन





android