2012-12-17 12 views
15

को एक अशक्त मान निर्दिष्ट करके निम्नलिखित कोड संभव है:किसी पूर्णांक

Integer a = null; 
int b = a; 

यह मतलब यह है एक पूर्णांक के लिए एक संभावित null मूल्य वाला फ़ंक्शन एक बुरा व्यवहार है?

संपादित करें 1: इन उत्तरों में कई अलग-अलग राय हैं। मैं एक या दूसरे को चुनने के लिए पर्याप्त आत्मविश्वास नहीं हूं।

+5

नल के आविष्कारक टोनी होरे ने इसे अपनी अरब डॉलर की गलती कहा। सामान्य रूप से 'शून्य' से बचें। –

+0

यदि आपको यह जानना आवश्यक है कि मान अज्ञात है तो यह बुरा व्यवहार नहीं है। 'NullPointerException' के लिए अपवाद हैंडलिंग अनुपस्थिति को प्रतिबिंबित करने के लिए आपके कोड में शामिल किया जा सकता है, नल INT को शून्य में परिवर्तित कर सकता है, आदि [NULL] (http://en.wikipedia.org/wiki/Null_%28SQL%29) है एक आवश्यक बुराई, ऐसे मामले हैं जहां आपको किसी अज्ञात या मूल्य की अनुपस्थिति को स्पष्ट रूप से पहचानने की आवश्यकता होती है, जैसे कि: मैं कितनी बार शादी करूँगा, मौत की तारीख इत्यादि। –

+0

@ टॉमहॉविन-टकलाइन इसलिए हम सभी जानते हैं कि वह था कम से कम एक बार गलत, जब वह न केवल बहस के लिए बल्कि विषय से भी दूर था। यह सवाल यह है कि यह प्रश्न भाषा डिजाइन और शून्य के बारे में नहीं है, जावा भाषा का एक बहुत ही अभिन्न अंग है जो भाषा डिजाइनर का मानना ​​भी असफल है – josefx

उत्तर

38

वह कोड NullPointerException देगा जब आप इसे चलाएंगे। यह मूल रूप से करने के लिए बराबर है:

Integer a = null; 
int b = a.intValue(); 

... जो यह स्पष्ट है कि यह वास्तव में असफल हो जायेगी बनाता है।

आप वास्तव मेंint पर शून्य मान निर्दिष्ट नहीं कर रहे हैं - आप कोशिश कर रहे हैं और विफल रहे हैं।

के मान के रूप में null का उपयोग करना ठीक है; वास्तव में अक्सर Integer ठीक एक "नल equivalent` रूप int के बजाय प्रयोग किया जाता है।

+0

यदि आपका फ़ंक्शन एक इंटीजर लौटाता है, तो जब यह फ़ंक्शन कॉल किया जाएगा, तो इस तरह के अपवाद से बचने के लिए इसे int के बजाय इंटीजर को असाइन किया जाना चाहिए। अन्यथा यह जोखिम भरा नहीं होगा? – JohnJohnGa

+1

@ जॉन जोहानगा: ठीक है हाँ। लेकिन फिर संभवतः यदि विधि 'int' की बजाय' इंटीजर 'लौट रही है, तो जानबूझकर * क्योंकि * यह शून्य हो सकती है। –

+0

एक पूर्णांक चर में सकारात्मक या नकारात्मक प्राकृतिक संख्या हो सकती है (..., -2, -1, 0, 1, 2, ...)। मान 0 (शून्य) हालांकि इस चर के लिए कुछ भी शामिल करने के लिए सही प्रतिनिधित्व नहीं है (इसमें मूल्य 0 है और केवल दिए गए संदर्भ में सम्मेलन का सुझाव हो सकता है कि 0 वास्तविक प्रतिनिधित्व के बजाय "कुछ नहीं" का प्रतिनिधित्व करता है: "कुछ भी नहीं" "कुछ कुछ")।कई परिस्थितियों में यह भी इस तथ्य का प्रतिनिधित्व करना आवश्यक है कि एक चर को कोई मूल्य नहीं दिया गया है। यह एक निरर्थक प्रकार के साथ हासिल किया जा सकता है। एक निरर्थक पूर्णांक को एक प्रश्न चिह्न (int? X) द्वारा घोषित किया जा सकता है। –

12

यह संभव नहीं है। आपको NullPointerException

+0

निर्भर करता है कि आप कैसे परिभाषित करते हैं। यह सफलतापूर्वक संकलित होगा। – JohnJohnGa

+5

@ जॉन जोहानगा: 'NullPointerException' रनटाइम में होता है। सुनिश्चित नहीं है कि आपका क्या मतलब है। क्या आप सही कोड या कोड चाहते हैं जो संकलित करता है? – Cratylus

6

यह एक NullPointerException फेंक देते हैं।

इस का कारण यह है कि आप एक को पूर्णांक मान के ऑटो unboxing पर भरोसा कर रहे हैं है int आदिम प्रकार। जावा ऑब्जेक्ट पर .intValue() को आंतरिक रूप से कॉल करके करता है, जो शून्य है।

या तो यह एक अच्छा अभ्यास है या नहीं ... मैं ऐसा करने के खिलाफ सलाह दूंगा, जब तक कोड केवल आपके द्वारा उपयोग नहीं किया जाता और आप बेहद अच्छी तरह से व्यवहार कर रहे हैं, यह सुनिश्चित कर लें कि आप केवल इस विधि का रिटर्न वैल्यू इंटीजर मानों को असाइन करें, न कि

यदि आपका कोड दूसरों द्वारा उपयोग किए जाने वाले lib में समाप्त होता है, तो यह सुरक्षित नहीं है, और मैं स्पष्ट रूप से एक अपवाद, अच्छी तरह से प्रलेखित, और कॉलर के हिस्से पर रक्षात्मक कोडिंग की अनुमति देता हूं।

2

बेशक आप एक int को शून्य नहीं सौंप सकते हैं। लेकिन कुछ परिस्थितियों में एक नल लौटने से समझ में आता है। नल का मतलब यह हो सकता है कि मान सेट नहीं है। एक सामान्य उदाहरण एक डीबी कॉलम है।

2

कोड संभव है, लेकिन अनबॉक्सिंग के कारण रनटाइम पर NullPointerException फेंकता है।

क्या इसका मतलब यह है कि पूर्णांक के लिए संभावित शून्य मान लौटने वाला फ़ंक्शन एक खराब अभ्यास है?

हाँ, यह है। यह Integer लौटने के लिए बेकार और खतरनाक है (जैसा कि आप देख सकते हैं) int पर्याप्त है, क्योंकि ऑब्जेक्ट्स शून्य हो सकते हैं, जबकि प्राइमेटिव नहीं हो सकते हैं। Integer केवल तभी उपयोग किया जाना चाहिए जब पैरामीटरकृत प्रकार में - List<Integer>

1

यह वास्तव में काम करेगा।

Integer a = null; 
Integer b = a; 

लेकिन मैं नहीं बल्कि सीमा से बाहर एक पूर्णांक मूल्य का प्रयोग करेंगे (-1 अगर आपके नंबर सभी सकारात्मक रहे हैं) एक त्रुटि के मामले में वापस जाने के लिए।

0

यह एक ऑटो जावा मुक्केबाजी है।

Integer a = null; 
int b = a; 

इस कोड को ख के लिए एक निर्दिष्ट करते हैं, वास्तव में संकलक क्या करेंगे इस: int b = a.intValue(), तो यह लाइन NullPointerException फेंक देगा;

कोड:

Integer a = 1; 

वास्तव में यह कर देगा: पूर्णांक एक = Integer.valueOf (1);

आप संकलित आभासी मशीन निर्देश देखने के लिए javap उपयोग कर सकते हैं

0

आप साधारण परीक्षण लिख सकते हैं:।

public class Test { 
    public static void main(String[] args){ 
     Integer a = null; 
     int b = a; 

     System.out.println(b); 
    } 
} 

और उत्पादन int b = a;

Exception in thread "main" java.lang.NullPointerException 
    at Test.main(Test.java:11) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 
1

पर एक NullPointerException है जावा टेनेरी ऑपरेटर के साथ मजेदार चीज?: (ओएसएक्स पर 8u151 का उपयोग करके)

आप

Integer x = map == null ? 0 : map.get (key); 

जो ठीक है और कॉम्पैक्ट और सब लगता है ऐसा है, तो आप एक एनपीई मिल !!! यदि

map.get (key) 

एक शून्य है। तो मुझे इसे विभाजित करना पड़ा और यह ठीक काम किया।

संबंधित मुद्दे