Double.parseDouble (null) और Integer.parseInt (null) अलग-अलग अपवाद क्यों फेंकते हैं?


92

Double.parseDouble (null) और Integer.parseInt (null) अलग-अलग अपवाद क्यों फेंकते हैं?

यह एक ऐतिहासिक दुर्घटना है या जानबूझकर? दस्तावेज़ में स्पष्ट रूप से दो प्रकार के अपवाद हैं Double.parseDouble(...)और एक के लिए Integer.parseInt(), लेकिन यह असंगत लगता है:

Integer.parseInt(null); // throws java.lang.NumberFormatException: null

तथापि

Double.parseDouble(null); // throws java.lang.NullPointerException

2
@ एक्विलो: इसमें doubleआदिम डॉक्स है। कोरल.com
javase/

2
संबंधित विधियों के स्रोत कोड की जाँच करना, यह सिर्फ एक असंगति जैसा लगता है। parseDoubleएक अशक्त जाँच नहीं करता है, और जब सामना होता है तो सिर्फ एक एनपीई फेंकता है, लेकिन parseIntफिर इनपुट स्ट्रिंग की जाँच की जाती है null। मैं कोई अच्छा कारण नहीं देख सकता कि उन्हें अलग व्यवहार क्यों करना चाहिए।
NilsH

मैंने जाँच की है कि वे उसी NumberFormatException को फेंक देते हैं।
Twlkyao

जवाबों:


67

अशक्त के लिए समान अपवादों की अपेक्षा करना उचित है; हालाँकि, ये एपी बहुत पुराने हैं और इस बिंदु पर परिवर्तित होने में सक्षम नहीं हो सकते हैं।

तथा:

चूंकि JavaDoc में अपवाद व्यवहार लंबे समय से स्थायी और निर्दिष्ट है, इसलिए इस समय विधि के व्यवहार को बदलना अव्यावहारिक है। बंद करना ठीक नहीं होगा।

जैसा कि लिया गया: बग रिपोर्ट: Integer.parseInt () और Double.parseDouble () नल पर अलग-अलग अपवादों को फेंकते हैं।

जैसा दूसरों ने कहा है: यह विभिन्न लेखकों द्वारा बनाया गया है।


2
संबंधित और दिलचस्प बग रिपोर्ट: Bugs.sun.com/view_bug.do?bug_id=6463998 जावा 6 की तरह लगता है, डबल / फ्लोट वर्ग से पार्स विधि एनपीई फेंकता है।
न्हाथ्ठ

2
स्पष्ट रूप से, टिप्पणी ने कहा कि यह कार्यक्षमता उस समय "बहुत पुरानी" थी, और अब से 15 साल पहले थी।
साउथपावर हरे

यह असंगति जावा 1.0 में सबसे अधिक संभावना है। दुर्भाग्य से, यह सत्यापित करना मुश्किल होगा। मुझे नहीं लगता कि जावा 1.0 डाउनलोड के लिए उपलब्ध है, और इसे चलाने के लिए आपको विंडोज 95 / NT बॉक्स की आवश्यकता होगी। या एक प्राचीन स्पार्क मशीन।)
स्टीफन सी

59

नोट: इस पोस्ट में सब कुछ Java7-b147 के स्रोत में है

Double.parseDouble()सन लाइब्रेरी में जाता है (इन sun.misc.FloatingDecimal) पहली महत्वपूर्ण बात यह है कि:

in = in.trim(); // don't fool around with white space.
                // throws NullPointerException if null

Integer.parseInt()Integerवर्ग में मैन्युअल रूप से किया जाता है । पहली महत्वपूर्ण बात यह है कि:

if (s == null) {
    throw new NumberFormatException("null");
}

मुझे लगता है कि दो अलग-अलग लेखक हैं।

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