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


252

क्या है null?

है nullकुछ भी का एक उदाहरण?

क्या सेट से nullसंबंधित है?

यह स्मृति में किस प्रकार दर्शाया गया है?


yegor256। JLS से शून्य के बारे में। "अशक्त शाब्दिक। अशक्त प्रकार का एक मान होता है, अशक्त संदर्भ, अशक्त शाब्दिक नल द्वारा दर्शाया जाता है, जो ASCII वर्णों से बनता है। एक अशक्त शाब्दिक हमेशा अशक्त प्रकार का होता है।" लेख में बिंदुओं के बारे में। And म्यूटेबल और अधूरी वस्तुएं ’एक विशेषता है। 'स्लो फेलिंग' डिजाइन की क्षमता है। 'कंप्यूटर थिंकिंग बनाम ऑब्जेक्ट थिंकिंग' सोच के सिर्फ दो तरीके हैं। 'एंबीशियस सिमेंटिक' बहुत व्यक्तिपरक है। 'एड-हॉक एरर हैंडलिंग' त्रुटियों के साथ काम करने का एक और प्रकार है। नल एक शाब्दिक या कुछ भी है जो जेएलएस में निर्दिष्ट है जो अच्छा या बुरा नहीं होने के विपरीत है।
ओलेक्सी किस्लीत्सिन

जवाबों:


310

क्या किसी भी चीज़ का उदाहरण है?

नहीं, कोई प्रकार नहीं है जो nullकि ए instanceof

15.20.2 प्रकार तुलना ऑपरेटर instanceof

RelationalExpression:
    RelationalExpression instanceof ReferenceType

रन समय, का परिणाम instanceofऑपरेटर है trueयदि का मान RelationalExpression नहीं है nullऔर संदर्भ के लिए डाली जा सकता है ReferenceType एक को ऊपर उठाने के बिना ClassCastException। अन्यथा परिणाम है false

इसका मतलब यह है कि किसी भी प्रकार के लिए Eऔर R, किसी के लिए E o, जहां o == null, o instanceof Rहमेशा होता है false


'नल' किस सेट से संबंधित है?

JLS 4.1 प्रकार और मूल्यों के प्रकार

एक विशेष अशक्त प्रकार भी है , अभिव्यक्ति का प्रकार null, जिसका कोई नाम नहीं है। क्योंकि अशक्त प्रकार कोई नाम नहीं है, इसके बारे में एक चर घोषित करने के लिए असंभव है अशक्त करने के प्रकार या कलाकारों को अशक्त प्रकार। nullसंदर्भ की अभिव्यक्ति का एकमात्र संभावित मूल्य है अशक्त प्रकार। nullसंदर्भ हमेशा किसी भी संदर्भ प्रकार के डाली जा सकती है। व्यवहार में, प्रोग्रामर अशक्त प्रकार को अनदेखा कर सकता है और सिर्फ दिखावा nullकर सकता है जो केवल एक विशेष शाब्दिक है जो किसी भी संदर्भ प्रकार का हो सकता है।


अशक्त क्या है?

जैसा कि ऊपर जेएलएस उद्धरण कहता है, व्यवहार में आप बस यह दिखावा कर सकते हैं कि यह "केवल एक विशेष शाब्दिक है जो किसी भी संदर्भ प्रकार का हो सकता है"।

जावा में, null == null(यह हमेशा अन्य भाषाओं में ऐसा नहीं होता है)। यह भी ध्यान दें कि अनुबंध के अनुसार, इसमें यह विशेष गुण (से java.lang.Object) भी है:

public boolean equals(Object obj)

किसी भी गैर के लिए-null संदर्भ मूल्य के लिए x, x.equals(null)चाहिए return false

यह सभी संदर्भ प्रकारों के लिए डिफ़ॉल्ट मान (चर के लिए जो उनके पास है) भी है:

जेएलएस 4.12.5 चर के प्रारंभिक मूल्य

  • प्रत्येक वर्ग चर, उदाहरण चर, या सरणी घटक को डिफ़ॉल्ट मान के साथ प्रारंभ किया जाता है जब इसे बनाया जाता है:
    • सभी संदर्भ प्रकारों के लिए, डिफ़ॉल्ट मान है null

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

इसके अन्य उपयोग भी हैं। चलो एक वास्तविक उदाहरण लेते हैं java.lang.System:

public static Console console()

रिटर्न : सिस्टम कंसोल, यदि कोई हो, अन्यथाnull

यह एक बहुत ही सामान्य उपयोग पैटर्न है: null किसी वस्तु के गैर-अस्तित्व को दर्शाने के लिए उपयोग किया जाता है।

इस बार इसका एक और उपयोग उदाहरण है java.io.BufferedReader:

public String readLine() throws IOException

रिटर्न : Stringकिसी भी लाइन-टर्मिनेशन वर्णों को शामिल नहीं करते हुए, या लाइन की सामग्री, याnull यदि स्ट्रीम के अंत तक पहुंच गया है ।

तो यहाँ, प्रत्येक पंक्ति के लिए readLine()वापस आ जाएगा instanceof String, जब तक कि यह अंत nullमें अंत को सूचित करने के लिए वापस नहीं आएगा । यह आपको प्रत्येक पंक्ति को निम्नानुसार संसाधित करने की अनुमति देता है:

String line;
while ((line = reader.readLine()) != null) {
   process(line);
}

एक एपीआई को डिज़ाइन कर सकता है ताकि समाप्ति की स्थिति readLine()लौटने पर निर्भर न हो null, लेकिन कोई यह देख सकता है कि इस डिज़ाइन में चीजों को संक्षिप्त करने का लाभ है। ध्यान दें कि खाली लाइनों के साथ कोई समस्या नहीं है, क्योंकि एक खाली लाइन "" != null

आइए एक और उदाहरण लेते हैं, इस बार java.util.Map<K,V>:

V get(Object key)

वह मान लौटाता है जिसमें निर्दिष्ट कुंजी मैप की जाती है, या nullयदि इस नक्शे में कुंजी के लिए कोई मैपिंग नहीं है।

यदि यह मानचित्र nullमानों की अनुमति देता है, तो nullजरूरी नहीं कि वापसी मान दर्शाता है कि नक्शे में कुंजी के लिए कोई मैपिंग नहीं है; यह भी संभव है कि नक्शा कुंजी को स्पष्ट रूप से मैप करता हो nullcontainsKeyआपरेशन इन दो मामलों भेद करने के लिए इस्तेमाल किया जा सकता है।

यहां हम यह देखना शुरू करते हैं कि किस तरह से nullचीजों को जटिल बनाया जा सकता है। पहला कथन कहता है कि यदि कुंजी मैप नहीं की गई है, nullतो वापस कर दी जाती है। दूसरा बयान का कहना है कि भले ही कुंजी मैप किया गया है, nullकर सकते हैं भी लौटा दी।

इसके विपरीत, चाबियाँ और मूल्यों की java.util.Hashtableअनुमति न देकर चीजों को सरल रखता nullहै; आईटी इसV get(Object key) रिटर्न अगर null, स्पष्ट रूप से इसका मतलब है कि कुंजी मैप नहीं है।

आप बाकी एपीआई के माध्यम से पढ़ सकते हैं और पा सकते हैं कि कहां और कैसे nullउपयोग किया जाता है। ध्यान रखें कि वे हमेशा सबसे अच्छा अभ्यास उदाहरण नहीं हैं।

आम तौर पर बोलने के लिए, nullएक विशेष मान के रूप में उपयोग किया जाता है:

  • असिंचित अवस्था
  • समाप्ति की स्थिति
  • गैर-विद्यमान वस्तु
  • एक अज्ञात मूल्य

यह स्मृति में किस प्रकार दर्शाया गया है?

जावा में? आपकी कोई चिंता नहीं। और यह सबसे अच्छा तरीका है।


है nullएक अच्छी बात है?

यह अब सीमावर्ती व्यक्तिपरक है। कुछ लोग कहते हैं कि nullकई प्रोग्रामर त्रुटियों का कारण बनता है जिन्हें टाला जा सकता था। कुछ लोग कहते हैं कि एक भाषा में जो NullPointerExceptionजावा की तरह पकड़ती है, इसका उपयोग करना अच्छा है क्योंकि आप प्रोग्रामर त्रुटियों पर विफल होंगे। कुछ लोग नल ऑब्जेक्ट पैटर्न आदि nullका उपयोग करने से बचते हैं ।

यह अपने आप में एक बहुत बड़ा विषय है, इसलिए किसी अन्य प्रश्न के उत्तर के रूप में इसकी सबसे अच्छी चर्चा की जाती है।

मैं nullखुद के आविष्कारक , कार होरे (क्विकॉर्ट फेम के एक उद्धरण) के साथ इसे समाप्त करूंगा।

मैं इसे अपनी अरबों डॉलर की गलती कहता हूं। यह null1965 में संदर्भ का आविष्कार था । उस समय, मैं ऑब्जेक्ट ओरिएंटेड भाषा (ALGOL W) में संदर्भ के लिए पहला व्यापक प्रकार का सिस्टम डिजाइन कर रहा था। मेरा लक्ष्य यह सुनिश्चित करना था कि संकलक द्वारा स्वचालित रूप से किए गए चेकिंग के साथ सभी संदर्भों का उपयोग पूरी तरह से सुरक्षित होना चाहिए। लेकिन मैं एक nullसंदर्भ में डालने के लिए प्रलोभन का विरोध नहीं कर सका , सिर्फ इसलिए कि इसे लागू करना इतना आसान था। इससे असंख्य त्रुटियां, कमजोरियां और सिस्टम क्रैश हो गए हैं, जिसने पिछले चालीस वर्षों में संभवतः एक अरब डॉलर का दर्द और क्षति पहुंचाई है।

इस प्रस्तुति का वीडियो गहरा गया; यह एक अनुशंसित घड़ी है।


4
NIL1960 में LISP (as ) में अशक्त संदर्भ मौजूद थे और शायद पहले भी। लेकिन मुझे नहीं लगता कि होरे वास्तव में उस उद्धरण में अशक्त संदर्भों के आविष्कार का दावा करने की कोशिश कर रहा है।
स्टीफन सी

7
होरे अशक्त संदर्भों के आविष्कार का दावा करने की कोशिश नहीं कर रहा है; वह केवल यह दावा कर रहा है कि उसने उन्हें एक विशेष रूप से प्रभावशाली स्थान पर उपलब्ध कराया है। जावा सहित कई भाषाएं हैं, जो स्पष्ट रूप से अल्गोल से प्रेरणा लेती हैं, और यदि उनके अशक्त संदर्भों का उपयोग भी अल्गोल से प्रेरित या कॉपी किया गया था, तो होरे इन की लागत के लिए कुछ दोष लेने में सही है। हालाँकि, मुझे लगता है कि उसका अनुमान कम है। एक ट्रिलियन डॉलर सही लागत के करीब हो सकता है।
cjs

32

क्या किसी भी चीज़ का उदाहरण है?

नहीं, यही कारण है कि सभी वर्गों के लिए null instanceof Xवापस आ जाएगी । (इस तथ्य से मूर्ख मत बनो कि आप एक चर के लिए असाइन कर सकते हैं जिसका प्रकार एक ऑब्जेक्ट प्रकार है। सख्ती से बोलना, असाइनमेंट में एक अंतर्निहित प्रकार रूपांतरण शामिल है। नीचे देखें।)falseXnull

'नल' किस सेट से संबंधित है?

यह अशक्त प्रकार का एक और एकमात्र सदस्य है, जहाँ अशक्त प्रकार को निम्न प्रकार से परिभाषित किया गया है:

"एक विशेष अशक्त प्रकार भी है, अभिव्यक्ति शून्य का प्रकार, जिसका कोई नाम नहीं है। क्योंकि अशक्त प्रकार का कोई नाम नहीं है, इसलिए अशक्त प्रकार के एक चर को घोषित करना या अशक्त प्रकार में डालना असंभव है। अशक्त संदर्भ अशक्त प्रकार की अभिव्यक्ति का एकमात्र संभव मूल्य है। शून्य संदर्भ हमेशा किसी भी संदर्भ प्रकार के लिए डाला जा सकता है। व्यवहार में, प्रोग्रामर अशक्त प्रकार को अनदेखा कर सकता है और सिर्फ यह दिखावा करता है कि अशक्त केवल एक विशेष शाब्दिक है जो किसी का भी हो सकता है। संदर्भ प्रकार। " JLS 4.1

अशक्त क्या है?

ऊपर देखो। कुछ संदर्भों में, null"कोई वस्तु" या "अज्ञात" या "अनुपलब्ध" को निरूपित करने के लिए उपयोग किया जाता है, लेकिन ये अर्थ अनुप्रयोग विशिष्ट हैं।

यह स्मृति में किस प्रकार दर्शाया गया है?

यह विशिष्ट कार्यान्वयन है, और आप nullएक शुद्ध जावा कार्यक्रम में प्रतिनिधित्व नहीं देख पाएंगे । (लेकिन nullशून्य मशीन पते / सूचक के रूप में प्रतिनिधित्व किया जाता है यदि सभी जावा कार्यान्वयन नहीं हैं।)


14

अशक्त क्या है?

यह कुछ भी नहीं है।

क्या किसी भी चीज़ का उदाहरण है?

जैसा कि यह कुछ भी नहीं है यह किसी भी चीज का उदाहरण नहीं हो सकता है।

नल किस सेट से संबंधित है?

कोई सेट नहीं

यह स्मृति में किस प्रकार दर्शाया गया है?

यदि कुछ संदर्भ इसे पसंद करते हैं:

Object o=new Object();

हीप मेमोरी में कुछ जगह नई निर्मित वस्तु को सौंपी जाती है। और ओ स्मृति में उस निर्दिष्ट स्थान को इंगित करेगा।

अभी o=null;

इसका मतलब यह है कि अब ओ ऑब्जेक्ट के मेमोरी स्पेस की ओर इशारा नहीं करेगा।


1
"अब ओ = अशक्त; इसका मतलब है कि अब ओ ऑब्जेक्ट के उस मेमोरी स्पेस को इंगित नहीं करेगा।" मुझे लगता है कि यह गारबेज कलेक्शन
जेएवीए

9

नहीं, यह किसी भी चीज का उदाहरण नहीं है, उदाहरण हमेशा गलत होगा।


7

अशक्त कीवर्ड एक शाब्दिक है जो एक अशक्त संदर्भ का प्रतिनिधित्व करता है , वह जो किसी वस्तु का संदर्भ नहीं देता है । null संदर्भ-प्रकार चर का डिफ़ॉल्ट मान है।

इसके अलावा शायद पर एक नज़र है

null: जावा शब्दावली


2
यह एक खोजशब्द नहीं है, यह एक शाब्दिक है । खराब गुणवत्ता और गैर-मानक प्रशस्ति पत्र।
लोरेन

6

अशक्त किसी भी वर्ग का उदाहरण नहीं है।

हालाँकि, आप किसी भी प्रकार के ऑब्जेक्ट (ऑब्जेक्ट या एरे) प्रकार के अशक्त को असाइन कर सकते हैं:

 // this is false   
 boolean nope = (null instanceof String);

 // but you can still use it as a String
 String x = null;
 "abc".startsWith(null);

6

जावा में शून्य (tm)

C और C ++ में, "NULL" एक हेडर फ़ाइल में एक स्थिर परिभाषा है, जिसका मान इस प्रकार है:

    0

या:

    0L

या:

    ((void*)0)

कंपाइलर और मेमोरी मॉडल विकल्पों पर निर्भर करता है। NULL, सख्ती से नहीं बोल रहा है, C / C ++ का ही हिस्सा है।

Java (tm) में, "null" एक कीवर्ड नहीं है, बल्कि null प्रकार का एक विशेष शाब्दिक है। इसे किसी भी संदर्भ प्रकार में डाला जा सकता है, लेकिन किसी भी आदिम प्रकार जैसे कि इंट या बूलियन को नहीं। शून्य शाब्दिक रूप से मूल्य शून्य नहीं है। और यह अशक्त प्रकार में डालना असंभव है या इस प्रकार का एक चर घोषित करना असंभव है।


5

बायोटेक प्रतिनिधित्व

जावा का nullसीधा JVM समर्थन है: इसे लागू करने के लिए तीन निर्देशों का उपयोग किया जाता है:

  • aconst_null: जैसे करने के लिए एक चर सेट करने के लिए nullके रूप मेंObject o = null;
  • ifnullऔर ifnonnull: करने के लिए एक वस्तु की तुलना करने जैसे nullके रूप मेंif (o == null)

अध्याय 6 "जावा वर्चुअल मशीन इंस्ट्रक्शन सेट" तब nullअन्य निर्देशों के प्रभावों का उल्लेख करता है : यह NullPointerExceptionउनमें से कई के लिए फेंकता है ।

2.4। "संदर्भ प्रकार और मूल्य"null में सामान्य शब्दों का भी उल्लेख है:

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


4

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


3

nullएक विशेष मूल्य है जो किसी भी वर्ग का उदाहरण नहीं है। यह निम्नलिखित कार्यक्रम द्वारा चित्रित किया गया है:

public class X {
   void f(Object o)
   { 
      System.out.println(o instanceof String);   // Output is "false"
   }
   public static void main(String[] args) {
      new X().f(null);
   }
}

6
केवल एक चीज जो उदाहरण दिखाती है, वह nullउदाहरण नहीं है String
साशा चेदिगोव

4
यदि आपने हस्ताक्षर को बदल दिया है void f(String o), तो यह अधिक समझ में आएगा।
थिलो

2

जावा में null C ++ में nullptr के समान / समान है।

C ++ में कार्यक्रम:

class Point
{
    private:
       int x;
       int y;
    public:
       Point(int ix, int iy)
       {
           x = ix;
           y = iy;
       }
       void print() { std::cout << '(' << x << ',' << y << ')'; }
};
int main()
{
    Point* p = new Point(3,5);
    if (p != nullptr)
    {
       p->print();
       p = nullptr;
    }
    else
    {
        std::cout << "p is null" << std::endl;
    }
    return 0;
}

जावा में एक ही कार्यक्रम:

public class Point {
    private int x;
    private int y;
    public Point(int ix, int iy) {
        x = ix;
        y = iy;
    }
    public void print() { System.out.print("(" + x + "," + y + ")"); }
}
class Program
{
    public static void main(String[] args) {
        Point p = new Point(3,5);
        if (p != null)
        {
            p.print();
            p = null;
        }
        else
        {
            System.out.println("p is null");
        }
    }
}

अब आप ऊपर दिए गए कोड से समझते हैं कि जावा में क्या अशक्त है? यदि नहीं, तो मैं आपको C / C ++ में पॉइंटर्स सीखने की सलाह देता हूं और फिर आप समझ जाएंगे।

ध्यान दें कि C ++ के विपरीत, nullptr अपरिभाषित है, लेकिन NULL का उपयोग इसके बजाय किया जाता है, जिसका उपयोग C ++ में भी किया जा सकता है, लेकिन C ++ में nullptr सिर्फ NULL की तुलना में अधिक बेहतर है, क्योंकि C में NULLpt हमेशा बिंदुओं से संबंधित है और वह है यह, इसलिए C ++ में प्रत्यय "ptr" शब्द के अंत में जोड़ा गया था, और यह भी कि सभी अक्षर अब लोअरकेस हैं, लेकिन यह कम महत्वपूर्ण नहीं है।

जावा में प्रत्येक प्रकार का वर्ग गैर-आदिम हमेशा उस प्रकार की वस्तु के संदर्भ में होता है या विरासत में मिला है और अशक्त है शून्य वर्ग ऑब्जेक्ट संदर्भ, लेकिन शून्य सूचक नहीं, क्योंकि जावा में ऐसा कोई "सूचक" नहीं है, लेकिन कक्षा का संदर्भ इसके बजाय ऑब्जेक्ट्स का उपयोग किया जाता है, और जावा में null क्लास ऑब्जेक्ट संदर्भों से संबंधित है, इसलिए आप इसे "nullref" या "nullrefobj" भी कह सकते हैं, लेकिन यह लंबा है, इसलिए इसे "null" कहें।

C ++ में आप पॉइंटर्स और nullptr वैल्यू को वैकल्पिक सदस्यों / चर, अर्थात सदस्य / वैरिएबल के लिए उपयोग कर सकते हैं , जिसका कोई मूल्य नहीं है और यदि इसका कोई मूल्य नहीं है, तो यह nullptr के बराबर है, इसलिए जावा में null को उदाहरण के लिए कैसे उपयोग किया जा सकता है।


1

जावा में दो प्रमुख श्रेणियां हैं: आदिम और संदर्भ । एक आदिम प्रकार की दुकान मूल्यों के रूप में घोषित चर; एक संदर्भ प्रकार की दुकान के संदर्भ में घोषित चर।

String x = null;

इस स्थिति में, इनिशियलाइज़ेशन स्टेटमेंट एक चर "x" घोषित करता है। "X" स्ट्रिंग संदर्भ संग्रहीत करता है। यह यहाँ शून्य है। सबसे पहले, नल एक वैध वस्तु उदाहरण नहीं है, इसलिए इसके लिए कोई मेमोरी आवंटित नहीं की गई है। यह केवल एक मूल्य है जो इंगित करता है कि ऑब्जेक्ट संदर्भ वर्तमान में ऑब्जेक्ट का संदर्भ नहीं दे रहा है।


0

मेरी राय में जावा में अशक्त देखने का एक दिलचस्प तरीका यह है कि इसे कुछ इस तरह से देखा जाए कि यह जानकारी की अनुपस्थिति को दर्शाता नहीं है, लेकिन केवल एक शाब्दिक मूल्य के रूप में जिसे किसी भी प्रकार के संदर्भ में सौंपा जा सकता है। यदि आप इसके बारे में सोचते हैं यदि यह जानकारी के अभाव में निरूपित करता है तो a1 == a2 सत्य होने का कोई मतलब नहीं है (यदि वे दोनों को अशक्त मान दिया गया था) क्योंकि वे वास्तव में किसी भी वस्तु की ओर इशारा कर सकते हैं (हम बस नहीं पता है कि वे किन वस्तुओं की ओर इशारा करते हैं) ... वैसे null == null java में सच है। अगर java जैसे SQL: 1999 होगी तो null == null वापस आ जाएगी अज्ञात (SQL में एक बूलियन मान: 1999 तीन मान ले सकता है: सही, गलत और अज्ञात लेकिन व्यवहार में अज्ञात को वास्तविक सिस्टम में null के रूप में लागू किया जाता है) ... http://en.wikipedia.org/wiki/SQL


0

लघु और सटीक उत्तर जो आपके सभी प्रश्नों का औपचारिक रूप से JLS से उत्तर देते हैं:

3.10.7। द नल लिटरल

अशक्त प्रकार का एक मान होता है, अशक्त संदर्भ, अशक्त शाब्दिक नल द्वारा दर्शाया जाता है, जो ASCII वर्णों से बनता है।

एक अशक्त शाब्दिक हमेशा अशक्त प्रकार का होता है।

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

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