जावा: जाँच करें कि क्या कमांड लाइन तर्क शून्य हैं


89

मैं अपने कमांड लाइन के तर्कों के लिए कुछ त्रुटि जाँच करना चाह रहा हूँ

public static void main(String[] args)
{
    if(args[0] == null)
    {
        System.out.println("Proper Usage is: java program filename");
        System.exit(0);
    }
}

हालाँकि, यह सीमा अपवाद से एक सरणी देता है, जो समझ में आता है। मैं सिर्फ उचित उपयोग की तलाश में हूं।

जवाबों:


159

तर्क कभी नहीं हो सकते null। वे बस अभ्यस्त हैं।

दूसरे शब्दों में, आपको जो करने की ज़रूरत है, वह आपके तर्कों की लंबाई की जाँच करेगा।

public static void main(String[] args)
{
    // Check how many arguments were passed in
    if(args.length == 0)
    {
        System.out.println("Proper Usage is: java program filename");
        System.exit(0);
    }
}

18

@ jjnguy का जवाब ज्यादातर परिस्थितियों में सही है। यदि आप कभी भी nullतर्क सरणी (या किसी nullसरणी) में स्ट्रिंग नहीं देखेंगे, तोmain एप्लिकेशन को सामान्य तरीके से कमांड लाइन से चलाया जाता है, ।

हालाँकि, यदि अनुप्रयोग का कोई अन्य भाग किसी mainविधि को कॉल करता है, तो यह अनुमान योग्य है कि यह एक nullतर्क पारित कर सकता है याnull तर्क सरणी ।

हालाँकि (2), यह स्पष्ट रूप से एक अत्यधिक असामान्य उपयोग का मामला है, और यह एक mainप्रवेश-बिंदु विधि के लिए निहित अनुबंध का एक गंभीर उल्लंघन है । इसलिए, मुझे नहीं लगता कि आपको nullतर्क मानों की जाँच करने में परेशान होना चाहिए main। वे होने वाली अप्रत्याशित घटना में, कॉलिंग कोड को प्राप्त करने के लिए स्वीकार्य है NullPointerException। आखिरकार, यह अनुबंध का उल्लंघन करने के लिए कॉलर में एक बग है।


11

इस बिंदु पर विस्तार करने के लिए:

यह संभव है कि आर्ग्स चर स्वयं अशक्त होगा, लेकिन सामान्य निष्पादन के माध्यम से नहीं। सामान्य निष्पादन java.exeकमांड लाइन से प्रवेश बिंदु के रूप में उपयोग करेगा । हालाँकि, मैंने कुछ कार्यक्रमों को देखा है जो C++JNI के साथ संकलित कोड का उपयोग करते हैं jvm.dll, java.exe को पूरी तरह से दरकिनार करते हुए। इस मामले में, पारित करना संभव हैNULL मुख्य विधि , जिस स्थिति में आर्गन्स शून्य होंगे।

मैं हमेशा आपकी ज़रूरत के आधार पर जाँच if ((args == null) || (args.length == 0)), या करने की सलाह देता हूँ if ((args != null) && (args.length > 0))


0

आपको जांच करनी चाहिए (args == null || args.length == 0)। हालाँकि nullजाँच वास्तव में आवश्यक नहीं है, यह एक अच्छा अभ्यास है।


1
अनावश्यक जांच अच्छा अभ्यास नहीं है। nullजांच अनावश्यक है, लेकिन आप सही है कि कर रहे हैं lengthकी जांच आवश्यक है,
स्टीफन सी

0

अगर मैं जांचना चाहता हूं कि कमांड लाइन तर्क की कोई भी स्थानिक स्थिति पारित हो गई है या नहीं तो कैसे जांचें? उदाहरण के लिए कुछ परिदृश्यों में 2 कमांड लाइन आर्ग्स को पास किया जाएगा और कुछ में केवल एक को पास किया जाएगा तो यह कैसे जांच करेगा कि वीक्षक कॉम्नाड लाइन पास है या नहीं?

public class check {

public static void main(String[] args) {
if(args[0].length()!=0)
{
System.out.println("entered first if");
}
if(args[0].length()!=0 && args[1].length()!=0)
{
System.out.println("entered second if");
}
}
}

इसलिए उपरोक्त कोड में अगर args [1] पास नहीं हुआ है तो मुझे java.lang.ArrayIndexOutOfBoundsException मिल जाएगी:

तो मैं इससे कैसे निपट सकता हूं जहां मैं जांच सकता हूं कि क्या दूसरा तर्क पारित किया गया है या नहीं और यदि पारित हो गया है तो दर्ज करें। सहायता की आवश्यकता है।


कृपया इसे एक प्रश्न बनाएं। चूंकि यह प्रश्न का उत्तर नहीं देता है, इसलिए यह यहां नहीं है। इसके बजाय एक सवाल पूछने से, आपके पास जवाब पाने का एक बेहतर मौका है।
एलेक्सएच

-10

यदि आप कोई तर्क पारित नहीं करते हैं, तो उस स्थिति में भी आरजीएस आरंभिक हो जाता है, लेकिन बिना किसी मद / तत्व के। निम्नलिखित प्रयास करें, आपको एक ही प्रभाव मिलेगा :

 
public static void main(String[] args) throws InterruptedException {
        String [] dummy= new String [] {};
        if(dummy[0] == null)
        {
            System.out.println("Proper Usage is: java program filename");
            System.exit(0);
        }

    }


1
यह पूरी तरह से गलत है। यदि कोई एप्लिकेशन बिना कमांड लाइन के तर्कों के साथ लॉन्च किया जाता है, तो mainविधि को एक argsसरणी के साथ बुलाया जाएगा जिसकी लंबाई शून्य है।
स्टीफन सी

@Stephen किसी भी तत्व के बिना एक सरणी, की लंबाई शून्य है। फिर मेरे जवाब में गलत क्या है?
पुष्पेन्दु बनर्जी

@Puspendu - क्या गलत है जो dummy[0]सीमा अपवाद से बाहर एक सरणी सूचकांक फेंकता है !! यदि आप प्रोग्राम (वापस) को परीक्षण में बदलते हैं args[0]और इसे बिना किसी तर्क के चलाते हैं, तो डिट्टो।
स्टीफन सी

1
ठीक है, मैं अब समझ गया। यदि आपने अपना पहला वाक्य गलत नहीं समझा होता तो यह मदद करता। जैसा कि लिखा गया है यह अकल्पनीय है। मैंने ध्यान दिया कि आपने अपनी अंतिम टिप्पणी में इसे चुपचाप ठीक कर लिया। ख़ुशामदी।
स्टीफन सी

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