Java: controlla se gli argomenti della riga di comando sono nulli


89

Sto cercando di fare un po 'di controllo degli errori per i miei argomenti della riga di comando

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

Tuttavia, questo restituisce un'eccezione di matrice fuori dai limiti, il che ha senso. Sto solo cercando il corretto utilizzo.

Risposte:


159

Gli argomenti non possono mai essere null. Semplicemente non esisteranno.

In altre parole, quello che devi fare è controllare la lunghezza dei tuoi argomenti.

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

La risposta di @ jjnguy è corretta nella maggior parte delle circostanze. Non vedrai mai una nullstringa nell'array degli argomenti (o un nullarray) se mainviene chiamato eseguendo l'applicazione viene eseguita dalla riga di comando nel modo normale.

Tuttavia, se qualche altra parte dell'applicazione chiama un mainmetodo, è concepibile che possa passare un nullargomento o un nullarray di argomenti.

Tuttavia (2), questo è chiaramente un caso d'uso molto insolito ed è una grave violazione del contratto implicito per un mainmetodo del punto di ingresso. Pertanto, non penso che dovresti preoccuparti di controllare i nullvalori degli argomenti in main. Nell'improbabile eventualità che si verifichino, è accettabile che il codice chiamante ottenga un file NullPointerException. Dopotutto, violare il contratto è un bug nel chiamante.


11

Per approfondire questo punto:

È possibile che la stessa variabile args sia nulla, ma non tramite la normale esecuzione. L'esecuzione normale verrà utilizzata java.execome punto di ingresso dalla riga di comando. Tuttavia, ho visto alcuni programmi che utilizzano C++codice compilato con JNI per utilizzare jvm.dll, bypassando completamente java.exe. In questo caso, è possibile passare NULLal metodo principale, nel qual caso args sarà nullo.

Consiglio sempre di controllare if ((args == null) || (args.length == 0)), o in if ((args != null) && (args.length > 0))base alle tue necessità.


0

Dovresti controllare (args == null || args.length == 0). Sebbene il nullcontrollo non sia realmente necessario, è una buona pratica.


1
I controlli non necessari NON sono una buona pratica. Il nullcontrollo non è necessario, ma hai ragione sul fatto che il lengthcontrollo è necessario,
Stephen C

0

se voglio controllare se una posizione specifica dell'argomento della riga di comando viene passata o meno, come verificare? come ad esempio in alcuni scenari verranno passati 2 argomenti della riga di comando e in alcuni ne verrà passato solo uno, allora come si fa a controllare se viene passata o meno la riga di comando specifica?

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");
}
}
}

Quindi nel codice sopra se args [1] non viene passato, ottengo java.lang.ArrayIndexOutOfBoundsException:

quindi come posso affrontare questo punto in cui posso verificare se il secondo argomento è passato o meno e se è passato, inseriscilo. bisogno di assistenza al più presto.


Per favore, fai una domanda. Poiché non risponde alla domanda, non appartiene a questo posto. Facendo una domanda, invece, hai molte più possibilità di ottenere una risposta.
AlexH

-10

Se non si passa alcun argomento, anche in questo caso args viene inizializzato ma senza alcun elemento / elemento. Prova il seguente, otterrai lo stesso effetto :

 
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
Questo è totalmente sbagliato. Se un'applicazione viene avviata senza argomenti della riga di comando, il mainmetodo verrà chiamato con un argsarray la cui lunghezza è zero.
Stephen C

@Stephen Un array senza alcun elemento all'interno, ha lunghezza zero. Allora cosa c'è di sbagliato nella mia risposta?
Puspendu Banerjee

@Puspendu - ciò che è sbagliato è che dummy[0]genera un'eccezione di indice di array fuori dai limiti !! Idem se si cambia il programma (indietro) in testing args[0]e lo si esegue senza argomenti.
Stephen C

1
Ok ora capisco. Sarebbe stato d'aiuto se non avessi scritto male la tua prima frase. Come scritto è incomprensibile. Noto che l'hai tranquillamente corretto nel tuo ultimo commento. Subdolo.
Stephen C

1
"Non ho dato alcuna soluzione piuttosto ho cercato di descrivere il problema". Allora non pubblicare una risposta. Posta un commento.
Stealth Rabbi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.