2010-10-06 15 views
65

Estoy buscando para hacer un poco de comprobación de errores para mis argumentos de línea de comandoJava: Comprobar si los argumentos de línea de comandos son nulos

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

Sin embargo, este devuelve una matriz fuera de límites excepción, lo cual tiene sentido. Solo estoy buscando el uso adecuado.

Respuesta

117

Los argumentos nunca pueden ser null. Simplemente no existirán.

En otras palabras, lo que necesita hacer es verificar la longitud de sus argumentos.

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

Si no pasa ningún argumento, incluso en ese caso args se inicializa pero sin ningún elemento/elemento. Pruebe el siguiente, obtendrá el mismo efecto :


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

Esto es totalmente incorrecto. Si se lanza una aplicación sin argumentos de línea de comando, se llamará al método 'main' con una matriz' args' cuya longitud es cero. –

+0

@Stephen Una matriz sin ningún elemento adentro, tiene longitud cero. Entonces, ¿qué pasa con mi respuesta? –

+0

@Puspendu: lo que está mal es que 'dummy [0]' arroja una excepción de índice de matriz fuera de límites !! Lo mismo si cambia el programa (atrás) para probar 'args [0]' y lo ejecuta sin argumentos. –

12

@ respuesta de jjnguy es correcta en la mayoría de las circunstancias. Nunca verá una cadena null en la matriz de argumentos (o una matriz null) si se llama al main ejecutando la aplicación desde la línea de comandos de la manera normal.

Sin embargo, si alguna otra parte de la aplicación llama a un método main, es concebible que podría pasar un argumento null o null matriz de argumentos.

Sin embargo (2), esto es claramente un caso de uso muy inusual, y es una violación flagrante del contrato implícito de un método main de punto de entrada. Por lo tanto, no creo que deba molestarse en buscar valores de argumento null en main. En el caso improbable de que ocurran, es aceptable que el código de llamada obtenga un NullPointerException. Después de todo, es un error en la persona que llama violar el contrato.

0

Debe verificar (args == null || args.length == 0). Aunque el cheque null no es realmente necesario, es una buena práctica.

6

Para ampliar sobre este punto:

Es posible que la propia variable de argumentos será nulo, pero no a través de la ejecución normal. La ejecución normal utilizará java.exe como punto de entrada desde la línea de comando. Sin embargo, he visto algunos programas que usan el código compilado C++ con JNI para usar el jvm.dll, omitiendo completamente el java.exe. En este caso, es posible pasar NULL al método principal, en cuyo caso args será nulo.

Recomiendo siempre consultar if ((args == null) || (args.length == 0)), o if ((args != null) && (args.length > 0)) dependiendo de su necesidad.

Cuestiones relacionadas