2014-11-26 8 views
10

मैं निम्नलिखित कोड भर में आया था:NullPointerException या स्थिर चर की सामग्री प्रिंट होगा

public class TradingSystem { 

    private static String category = "electronic trading system"; 

    public static void main(String[] args) { 
     TradingSystem system = null; 
     System.out.println(system.category); 
} 

Output: इलेक्ट्रॉनिक व्यापार प्रणाली

मैं एक NullPointerException नहीं आश्चर्य हुआ!

क्यू 1। यह NullPointerException क्यों नहीं फेंक दिया?

प्रश्न 2। या समय संकलित करते समय, श्रेणी की घोषणा के कारण static ने इसे TradingSystem के साथ सिस्टम (i.e ऑब्जेक्ट संदर्भ) को प्रतिस्थापित करने के लिए बनाया है और इस तरह के अनिवार्य रूप से TradingSystem.category कहा जाता था?

+0

इसके अलावा http://stackoverflow.com/questions/3293353/how-come-invoking-a-static-method-on-a-null-reference-doesnt-throw-nullpointe – Raedwald

+0

@Raedwald तकनीकी रूप से एक डुप्लिकेट, बिल्कुल इस पर नकल नहीं है। लेकिन – KNU

उत्तर

7

जावा आवृत्ति वाक्यविन्यास का उपयोग कर कक्षा चर (यानी static वाले) तक पहुंचने की अनुमति देता है। दूसरे शब्दों में, कंपाइलर आपको system.category लिखने देता है, लेकिन यह इसे TradingSystem.category पर हल करता है, जो उस उदाहरण से स्वतंत्र है जिस पर इसे एक्सेस किया जाता है।

यही कारण है कि आपको NullPointerException नहीं मिलता है। हालांकि, यह वाक्यविन्यास पठनीय और भ्रमित नहीं है। यही कारण है कि आपको system.category के बजाय TradingSystem.category का उपयोग करने के लिए चेतावनी और सुझाव प्राप्त करना चाहिए।

+0

को जानना अच्छा है, इसलिए दूसरे प्रश्न में मेरा दूसरा प्रस्ताव सही था। – KNU

3

आपका कोड संकल्पनात्मक रूप से निम्नलिखित कोड से अलग नहीं है।

public class TradingSystem { 

    private static String category = "electronic trading system"; 

    public static void main(String[] args) { 
     System.out.println(TradingSystem.category); 

    } 
} 

भले ही आप सिस्टम ऑब्जेक्ट संदर्भ का उपयोग कर रहे हों, आप वास्तव में स्थिर मूल्य का उपयोग कर रहे हैं। जब आप स्थैतिक उपयोग करते हैं तो जावा उपयोग उदाहरणों की अनुमति देता है, लेकिन आपको सिंटैक्स से ऊपर प्राथमिकता देना चाहिए ताकि यह स्पष्ट हो कि आप स्थिर का उपयोग कर रहे हैं।

1

आपको क्लास इंस्टेंस का उपयोग करके स्थिर विधियों को कभी भी कॉल नहीं करना चाहिए, न ही इसकी आवश्यकता है। चूंकि कक्षा के स्तर पर स्थैतिक विधियों को निष्पादित किया जाता है, उदाहरण का उपयोग नहीं किया जाता है और इस प्रकार कोई शून्य सूचक अपवाद नहीं फेंक दिया जाता है।

+0

मुझे लगता है कि "कभी कॉल नहीं करना चाहिए ..." बहुत कठोर है। क्यूं कर? यदि ऐसा है, तो जावा ने कभी भी अनुमति देने के लिए वाक्य रचनात्मक रूप से अनुमति नहीं दी होगी, लेकिन ऐसा करता है। क्यूं कर? क्योंकि किसी वर्ग से संबंधित कुछ भी स्वाभाविक रूप से इसके उदाहरणों से संबंधित है और इसे कैसे कहा जाना चाहिए संदर्भ के अधीन है। कम से कम शाब्दिक अर्थ में। – KNU

+0

@ केएनयू मैं असहमत हूं। मुझे नहीं पता कि जावा स्थैतिक तरीकों को कॉल करने के इस तरीके की अनुमति क्यों देता है (मेरा अनुमान है कि कोड को सफलतापूर्वक संकलित करना है जो अन्यथा नहीं कर सकता) लेकिन यह केवल अप्रत्याशित व्यवहार की ओर जाता है। क्या आप एक उदाहरण दे सकते हैं जहां यह फायदेमंद है? –

+0

@ कोनार्ड मैं यह नहीं कह रहा हूं कि यह फायदेमंद हो सकता है लेकिन संदर्भ का उपयोग करने के लिए यह अधिक सार्थक/व्यावहारिक हो सकता है। जैसे ग्राहकों को यह जानने की आवश्यकता नहीं है कि विधि स्थिर/गैर स्थैतिक है, जबकि उनका उपयोग करते समय स्टेटिक सदस्यों को स्थैतिक और गैर स्थैतिक संदर्भ दोनों से बुलाया जा सकता है। – KNU

1

स्थैतिक को कक्षा के उद्देश्य के लिए "क्लास" कहा जाता है। तो यहां

System.out.println (system.category); "सिस्टम ट्रेडिंग सिस्टम के रूप में कार्य कर रहा है"

जो सही है। चूंकि आपको स्थिर चिह्नित फ़ील्ड या विधि को विकसित करने के लिए तत्काल ऑब्जेक्ट की आवश्यकता नहीं है।

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