क्या कोई जावा में अशक्त हो सकता है?


155

एक कर सकते intहोnull जावा में?

उदाहरण के लिए:

int data = check(Node root);

if ( data == null ) {
 // do something
} else {
 // do something
}

मेरा लक्ष्य एक फ़ंक्शन लिखना है जो एक रिटर्न देता है int। कहा चint है एक नोड की ऊंचाई में संग्रहीत किया जाता है, और यदि नोड मौजूद नहीं है, तो यह शून्य होगा, और मुझे इसकी जांच करने की आवश्यकता होगी।

मैं यह होमवर्क के लिए कर रहा हूं लेकिन यह विशिष्ट हिस्सा होमवर्क का हिस्सा नहीं है, यह मुझे जो कुछ कर रहा है उसके माध्यम से प्राप्त करने में मदद करता है।

टिप्पणियों के लिए धन्यवाद, लेकिन ऐसा लगता है कि बहुत कम लोगों ने वास्तव में पढ़ा है कि कोड के तहत क्या है, मैं पूछ रहा था कि मैं इस लक्ष्य को कैसे पूरा कर सकता हूं; यह पता लगाना आसान था कि यह काम नहीं करता है।


1
यह संकलन समय त्रुटि है।
मयूरबी

जवाबों:


201

int अशक्त नहीं हो सकता है, लेकिन Integer कर सकते हैं । जब आप इंटर्जर को अशक्त करते हैं तो आपको सावधान रहने की आवश्यकता है क्योंकि यह बहुत भ्रम और सिर को खरोंच कर सकता है!

इस प्रकार:

int a = object.getA(); // getA returns a null Integer

NullPointerExceptionवस्तु नहीं होने के बावजूद आपको एक देगा !

अपने प्रश्न का अनुसरण करने के लिए, यदि आप मूल्य की अनुपस्थिति का संकेत देना चाहते हैं, तो मैं जांच करूंगाjava.util.Optional<Integer>


2
इंटेगर वर्ग के अस्तित्व के लिए अच्छे कारण हैं, इसलिए इसका उपयोग तब करें जब जरूरतें मजबूर हों।
धन्य गीक

6
@ h2g2java: मुझे आशा है कि आप यह नहीं सोच रहे हैं कि उन्हें डिफ़ॉल्ट संग्रह के साथ उपयोग करने में सक्षम किया जा रहा है, क्योंकि हैशपॉन्ज <Integer, Integer> जैसे सामान के लिए अपशिष्ट का स्तर विशाल और गैर-सम्मोहक है। यही कारण है कि ट्रोव के TIntIntHashMap, केवल आदिम का उपयोग करते हुए, गैर-सम्मोहक हैशपॉ <Integer, Integer> सर्कल के आसपास चलता है।
SyntaxT3rr0r

1
int को null के लिए चेक नहीं किया जा सकता है, हालाँकि, आप जावा में int को इंटर्गर को कास्टिंग करके सुरक्षित रूप से null असाइन कर सकते हैं, उदाहरण के लिए यदि चेक (रूट) मेथड null वापस आ सकता है, तो आप सुरक्षित रूप से कुछ ऐसा करके int को कास्ट कर सकते हैं यह: int data = (Integer)check(node);
sactiw 14

@sactiw - क्या आप विस्तृत कर सकते हैं? मुझे यकीन है कि मुझे समझ नहीं आ रहा है कि आप क्या कर रहे हैं
ब्रायन एग्न्यू

7
@BrianAgnew मुझे बताइए कि मैंने यहाँ क्या कहा था, मैं स्पष्ट गलत था, मुझे मूल रूप से यह एहसास नहीं था कि int i = (Integer)null;इसे चलाते समय NPE रन-टाइम पर फेंक देगा।
सेक्टिव

40

नहीं, केवल वस्तु संदर्भ ही अशक्त हो सकते हैं, आदिम नहीं।


3
यह इंटगर वर्ग का उल्लेख करने योग्य है जो ओपी को शून्य मान चाहिए तो बेहतर होगा। या वह "नहीं मिला" इंगित करने के लिए एक नकारात्मक मूल्य का उपयोग कर सकता है
ग्लेन

31

यह पता लगाने का एक शानदार तरीका:

public static void main(String args[]) {
    int i = null;
}

संकलन करने का प्रयास करें।


37
वास्तव में .. ओपी ने पहले ही पाया कि अपने प्रश्न के अंतिम वाक्यांश के अनुसार खुद को: यह पता लगाना आसान था कि यह काम नहीं करता है।
BalusC

9
लगभग 4 साल बाद की स्थिति के लिए- वह बिट बाद के संपादन में था।
मैट लुओंगो

3
लेकिन .. Integer ii = null; int i = ii;संकलन करेंगे, लेकिन रन
premek.v

13

जावा में, int एक आदिम प्रकार है और इसे एक वस्तु नहीं माना जाता है। केवल वस्तुओं का एक शून्य मान हो सकता है। तो आपके प्रश्न का उत्तर नहीं है, यह शून्य नहीं हो सकता। लेकिन यह इतना सरल नहीं है, क्योंकि ऐसी वस्तुएं हैं जो सबसे आदिम प्रकार का प्रतिनिधित्व करती हैं।

इंटेगर वर्ग एक अंतर मूल्य का प्रतिनिधित्व करता है, लेकिन यह एक अशक्त मूल्य पकड़ सकता है। तुम पर निर्भरcheck पद्धति के , आप एक इंट या इंटेगर लौटा सकते हैं।

यह व्यवहार रूबी जैसी कुछ अधिक विशुद्ध रूप से ऑब्जेक्ट ओरिएंटेड भाषाओं से अलग है, जहां भी "आदिम" चीजों को चींटियों की तरह माना जाता है।


8

उपरोक्त सभी उत्तर के साथ मैं इस बिंदु को भी जोड़ना चाहूंगा।

आदिम प्रकारों के लिए, हमने मेमोरी साइज़ तय किया है अर्थात इंट के लिए हमारे पास 4 बाइट्स हैं और चार में हमारे पास 2 बाइट्स हैं। और नल का उपयोग केवल वस्तुओं के लिए किया जाता है क्योंकि स्मृति का आकार निश्चित नहीं है।

तो डिफ़ॉल्ट रूप से हमारे पास,

   int a=0;

और नहीं

   int a=null;

अन्य आदिम प्रकारों के साथ भी और इसलिए शून्य का उपयोग केवल वस्तुओं के लिए किया जाता है न कि आदिम प्रकारों के लिए।


5

कोड भी संकलित नहीं करेगा। केवल एक फुलवर्थ Objectहो सकता है null, जैसे Integer। यहाँ दिखाने के लिए एक मूल उदाहरण दिया गया है जब आप अशक्त के लिए परीक्षण कर सकते हैं:

Integer data = check(Node root);

if ( data == null ) {
 // do something
} else {
 // do something
}

दूसरी ओर, यदि check()लौटने की घोषणा की जाती है , तो intयह कभी नहीं हो सकता है nullऔर पूरा if-elseब्लॉक फिर से अधिक शानदार है।

int data = check(Node root);

// do something

ऑटोबॉक्सिंग की समस्याएं यहां भी लागू नहीं होती हैं जब check()वापसी की घोषणा की जाती है int। यदि यह वापस आ गया था Integer, तो इसके बदले आपको NullPointerExceptionअसाइन करते समय जोखिम हो सकता intहै Integer। इसे एक के रूप में निरूपित करना Integerऔर इसका उपयोग करनाif-else ब्लॉक के फिर करना वास्तव में अनिवार्य होगा।

ऑटोबॉक्सिंग के बारे में अधिक जानने के लिए, इस सन गाइड की जांच करें


1
दुर्भाग्य से अगर "चेक" एक इंटर्जर के बजाय एक इंट रिटर्न देता है, तो इससे मदद नहीं मिलेगी, क्योंकि इंट (जो शून्य नहीं होगा) स्वचालित रूप से इंटीजर में बॉक्स किया जाएगा।
पॉल टॉम्बलिन

2
D'oh, यह दिखाने के लिए सिर्फ एक मूल उदाहरण था जब आप अशक्त के लिए परीक्षण कर सकते हैं। दूसरी ओर, यदि चेक को वापस करने की घोषणा की जाती है int, तो यह कभी भी अशक्त नहीं हो सकता है और यदि ब्लॉक बहुत ही कम है तो पूरा नहीं हो सकता है।
बालूसी

3

इसके बजाय int iइसे घोषित करने के बजाय Integer iहम कर सकते हैंi=null;

Integer i;
i=null;

2

इंटेगर ऑब्जेक्ट सबसे अच्छा होगा। यदि आपको प्राइमिटिव का उपयोग करना चाहिए तो आप एक ऐसे मूल्य का उपयोग कर सकते हैं जो आपके उपयोग के मामले में मौजूद नहीं है। लोगों के लिए नकारात्मक ऊंचाई मौजूद नहीं है, इसलिए

public int getHeight(String name){
    if(map.containsKey(name)){
        return map.get(name);
    }else{
        return -1;
    }
}

1

नहीं, लेकिन int [] हो सकता है।

int[] hayhay = null; //: allowed (int[] is reference type)
int   hayno  = null; //: error   (int   is primitive type)
                     //: Message: incompatible types: 
                     //: <null> cannot be converted to int

0

जैसा कि @Glen ने एक टिप्पणी में उल्लेख किया है, आपके पास मूल रूप से इसके दो तरीके हैं:

  • "बाउंड आउट" मान का उपयोग करें। उदाहरण के लिए, यदि "डेटा" सामान्य उपयोग में कभी भी नकारात्मक नहीं हो सकता है, तो यह इंगित करने के लिए कि यह अमान्य है, नकारात्मक मान लौटाएं।
  • एक पूर्णांक का उपयोग करें। बस सुनिश्चित करें कि "चेक" विधि एक पूर्णांक लौटाता है, और आप इसे एक पूर्णांक नहीं एक पूर्णांक को निर्दिष्ट करते हैं। क्योंकि अगर एक "int" रास्ते में शामिल हो जाता है, तो स्वचालित बॉक्सिंग और अनबॉक्सिंग समस्या पैदा कर सकता है।

0

अपने चेक () पद्धति में नल की जाँच करें और अमान्य मान लौटाएं जैसे -1 या शून्य यदि शून्य है। फिर चेक उस मूल्य के लिए होगा, साथ में अशक्त गुजरने के बजाय। यह पुराने समय के 'सी' में एक सामान्य बात होगी।


0

इंट, बूलियन, या फ्लोट आदि जैसे कोई भी आदिम डेटा प्रकार अशक्त (पार्श्व) को संग्रहीत नहीं कर सकते हैं, क्योंकि जावा ने इंटेगर, बूलियन से बूलियन के समान इंट को संग्रहीत करने के लिए रैपर वर्ग प्रदान किया है।

जैसे: पूर्णांक i = अशक्त;


0

एक int null नहीं है, यह 0 हो सकता है यदि इसे इनिशियलाइज़ न किया जाए। यदि आप चाहते हैं कि एक पूर्णांक अशक्त होने में सक्षम हो, तो आपको इंट के बजाय पूर्णांक का उपयोग करने की आवश्यकता है। आदिमों का अशक्त मूल्य नहीं है। एक int के लिए डिफ़ॉल्ट 0 है।

डेटा प्रकार / डिफ़ॉल्ट मान (फ़ील्ड के लिए)

int ------------------ 0

लंबा ---------------- 0L

फ्लोट ---------------- 0.0f

डबल ------------- 0.0 डी

चार --------------- '\ u0000'

स्ट्रिंग --------------- अशक्त

बूलियन ------------ असत्य


-2

चूंकि आप अपना लक्ष्य पूरा करने का दूसरा तरीका पूछते हैं, मेरा सुझाव है कि आप एक आवरण वर्ग का उपयोग करें:

new Integer(null);

-17

मैं कोई विशेषज्ञ नहीं हूं, लेकिन मेरा मानना ​​है कि nullएक इंट के बराबर है 0

उदाहरण के लिए, यदि आप एक बनाते हैं, तो int[]प्रत्येक स्लॉट में 0विरोध होता हैnull , जब तक कि आप इसे किसी और चीज़ पर सेट न करें।

कुछ स्थितियों में, यह उपयोग का हो सकता है।


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