2012-09-10 11 views
8

मैं कुछ पर थोड़ा उलझन में हूँ। मैंने एक छोटा कोड स्निपेट लिखा था।जावा में तर्क तर्क() विधि भ्रम (शून्य जांच)

import java.util.*; 
class AA 
{ 
    public static void main(String args[]) 
    { 
    if(args == null) 
    { 
      System.out.println("I am null"); 
    } 
    else{ 
      System.out.println(args); 
     } 
} 
} 

यह एक साधारण परीक्षण है। हालांकि मैं कमांड लाइन से तर्क के रूप में कुछ भी नहीं पारित कर रहा हूं लेकिन अभी भी तर्क नहीं है कि इसका मतलब है कि JVM इसे पर स्ट्रिंग सरणी की तरह प्रारंभ करता है। इसके पीछे कोई विशिष्ट कारण क्यों है? मैं जानने के लिए उत्सुक उत्सुक हूं। कोई संकेतक सहायक होगा।

if(args.length == 0) 
{ 
     System.out.println("I am empty"); 
} else{ 
     System.out.println(args); 
} 
+0

के संभावित डुप्लिकेट (http://stackoverflow.com/questions/9605532/args-guaranteed-to-be-non-null), http [गैर-शून्य होने की गारंटी args?]: // प्रोग्रामर। stackexchange.com/questions/120355/is-it-better-to-return-null-or-empty-values-from-functions-method s-where-the-ret –

उत्तर

6

आप कुछ भी पारित नहीं करते हैं, args नहीं null है "। यह किया जाता है (अन्य कारणों के साथ) ताकि हमें तर्क वस्तु पर शून्य की जांच न करनी पड़े। यह एक छोटी सी चीज है लेकिन यह थोड़ी सी समय बचाती है।

+2

क्या इस व्यवहार ने भाषा स्पेक में कहीं भी कहा है? कोई संदर्भ? – kosa

+0

तर्क एक सरणी है और कमांड लाइन तर्कों का प्रतिनिधित्व करता है, और इसे कभी भी JVM द्वारा शुरू किया जाता है (प्रोग्राम प्रारंभ होने पर प्रोग्राम प्रारंभ होने पर), ताकि सरणी कभी शून्य न हो ... – aleroot

+1

@ नंबरी मैं उस की तलाश में था, भी, लेकिन मुझे एक निश्चित उत्तर नहीं मिला: धारा 12.1 में वे कहते हैं कि "जिस तरीके से प्रारंभिक वर्ग जावा वर्चुअल मशीन को निर्दिष्ट किया गया है, वह इस विनिर्देश के दायरे से बाहर है, लेकिन यह सामान्य वातावरण है, होस्ट वातावरण में कक्षा के पूर्ण-योग्य नाम के लिए कमांड लाइन तर्क के रूप में निर्दिष्ट करने के लिए कमांड लाइनों का उपयोग करें और निम्नलिखित कमांड-लाइन तर्कों के लिए स्ट्रिंग के रूप में उपयोग किए जाने के लिए विधि मुख्य के तर्क के रूप में प्रदान किया जाना चाहिए ", और वे नहीं प्रदान करते हैं आगे की जानकारी। तो मुझे लगता है कि एक 'शून्य' जांच जोड़ना एक अच्छा विचार हो सकता है। – dasblinkenlight

0

JVM बनाता है और एक स्ट्रिंग [] नाम "args के रूप में सभी तर्कों से गुजरता है: है खाली यह - धन्यवाद, बेन

+0

अरे यह बहुत उपयोगी है। मुझे मिल गया और जिज्ञासा हल हो गई। अनेक अनेक धन्यवाद। – benz

1

main विधि का तर्क कमांड लाइन से पारित स्ट्रिंग पैरामीटर शामिल होगा। कोई भी पारित कर रहे हैं, तो यह अभी भी null नहीं होगा लेकिन 0. के आकार बस की कोशिश करनी होगी:

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

आप देख सकते हैं कि एक अपवाद फेंका जाता है:

 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 
4

यह अर्थ है। यदि कोई तर्क नहीं है, तो इसका मतलब है कि आपकी तर्कों की सूची खाली है, इसका मतलब यह नहीं है कि तर्कों की धारणा मौजूद नहीं है। इसलिए args सूची एक शून्य के बजाय एक खाली सरणी (यानी कोई तर्क नहीं है) (यानी तर्क मौजूद नहीं हैं)।

+0

धन्यवाद एक टन निजी। मै समझ गया। यह वास्तव में एक उपयोगी स्पष्टीकरण था। – benz

0

तर्क स्ट्रिंग सरणी के आकार की जांच करें, यदि इसमें शून्य से कुछ भी नहीं है, और यदि आकार में कुछ से अधिक है तो आकार तोड़ने की कोशिश करें (यदि आप आईडीई का उपयोग कर रहे हैं) या सरणी की सामग्री देखने के लिए, सरणी पर फिर से करें।

1

अशक्त सरणी के लिए आपका जाँच गलत नहीं है अगर यह सच है कि args सरणी एक जावा प्रोग्राम की main कार्य करने के लिए पारित कर दिया कभी JVM से ही आरंभ नहीं हो जाता है, तो सरणी अशक्त कभी नहीं होगा के लिए नहीं थे, यह केवल खाली हो सकता है लेकिन शून्य नहीं। JVM गारंटी देता है कि args सरणी प्रारंभ की जाएगी। शून्य के लिए चेक अभी भी गलत नहीं है लेकिन यह अनावश्यक है और इसका अधिक अर्थ नहीं है, विशेष रूप से यह समझ में नहीं आया है कि आपने इसे दिया है (कमांड लाइन पर कोई तर्क पारित नहीं हुआ है)।

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

if(argsl.length == 0) { 
//Is empty 
} 

और तुम भी सीधे NullPointerException के बारे में चिंता किए बिना सरणी के माध्यम से पुनरावृति कर सकते हैं:

for(String arg : args) { 
    System.out.println(arg); 
} 
+0

धन्यवाद कि एक और तार्किक स्पष्टीकरण था। – benz

+0

"JVM गारंटी देता है कि तर्क सरणी प्रारंभ की जाएगी" क्या आप इसके लिए कोई संदर्भ प्रदान कर सकते हैं? हम वास्तव में आधिकारिक दस्तावेज की तलाश में हैं। – kosa

+0

@ नंबरी क्या आपने कभी जावा कार्यक्रम के मुख्य कार्य के एक तर्क सरणी पैरामीटर को देखा है? मैं नहीं ... – aleroot

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