Java: vérifiez si les arguments de ligne de commande sont nuls


89

Je cherche à vérifier les erreurs de mes arguments de ligne de commande

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

Cependant, cela renvoie une exception de tableau hors limites, ce qui est logique. Je recherche juste l'utilisation appropriée.

Réponses:


159

Les arguments ne peuvent jamais être null. Ils n'existeront tout simplement pas.

En d'autres termes, ce que vous devez faire est de vérifier la longueur de vos arguments.

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 réponse de @ jjnguy est correcte dans la plupart des cas. Vous ne verrez jamais une nullchaîne dans le tableau d'arguments (ou un nulltableau) si elle mainest appelée en exécutant l'application est exécutée à partir de la ligne de commande de la manière normale.

Cependant, si une autre partie de l'application appelle une mainméthode, il est concevable qu'elle puisse passer un nullargument ou un nulltableau d'arguments.

Cependant (2), c'est clairement un cas d'utilisation très inhabituel, et c'est une violation flagrante du contrat implicite pour une mainméthode de point d'entrée. Par conséquent, je ne pense pas que vous devriez vous soucier de vérifier les nullvaleurs des arguments dans main. Dans le cas peu probable où ils se produiraient, il est acceptable que le code appelant obtienne un NullPointerException. Après tout, c'est un bogue dans l'appelant de violer le contrat.


11

Pour développer ce point:

Il est possible que la variable args elle-même soit nulle, mais pas via une exécution normale. L'exécution normale sera utilisée java.execomme point d'entrée à partir de la ligne de commande. Cependant, j'ai vu certains programmes qui utilisent du C++code compilé avec JNI pour utiliser le jvm.dll, en contournant entièrement java.exe. Dans ce cas, il est possible de passer NULLà la méthode main, auquel cas args sera nul.

Je recommande de toujours vérifier if ((args == null) || (args.length == 0)), ou en if ((args != null) && (args.length > 0))fonction de vos besoins.


0

Vous devriez vérifier (args == null || args.length == 0). Bien que la nullvérification ne soit pas vraiment nécessaire, c'est une bonne pratique.


1
Les contrôles inutiles ne sont PAS une bonne pratique. La nullvérification n'est pas nécessaire, mais vous avez raison de dire que la lengthvérification est nécessaire,
Stephen C

-10

Si vous ne passez aucun argument, même dans ce cas, args est initialisé mais sans aucun élément / élément. Essayez le suivant, vous obtiendrez le même effet :

 
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
Ceci est totalement incorrect. Si une application est lancée sans argument de ligne de commande, la mainméthode sera appelée avec un argstableau dont la longueur est égale à zéro.
Stephen C

@Stephen Un tableau sans aucun élément à l'intérieur, a une longueur nulle. Alors qu'est-ce qui ne va pas dans ma réponse?
Puspendu Banerjee

@Puspendu - ce qui ne va pas, c'est que dummy[0]jette un index de tableau hors limites !! Idem si vous changez le programme (retour) en test args[0]et l'exécutez sans argument.
Stephen C du

1
OK je comprends maintenant. Cela aurait aidé si vous n'aviez pas mal saisi votre première phrase. Tel qu'il est écrit, il est inintelligible. Je constate que vous l'avez tranquillement corrigé dans votre dernier commentaire. Sournois.
Stephen C

1
"Je n'ai donné aucune solution mais j'ai essayé de décrire le problème". Alors ne postez pas de réponse. Poste un commentaire.
Stealth Rabbi
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.