Java: compruebe si los argumentos de la línea de comandos son nulos

89

Estoy buscando hacer una verificación de errores para mis argumentos de línea de comando

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

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

Bobby S
fuente

Respuestas:

159

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

En otras palabras, lo que debe 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);
    }
}
jjnguy
fuente
18

La respuesta de @jjnguy es correcta en la mayoría de las circunstancias. Nunca verá una nullcadena en la matriz de argumentos (o una nullmatriz) simain se llama al ejecutar la aplicación se ejecuta desde la línea de comandos de la manera normal.

Sin embargo, si alguna otra parte de la aplicación llama a un mainmétodo, es posible que pase un nullargumento onull matriz de argumentos.

Sin embargo (2), este es claramente un caso de uso muy inusual y es una violación flagrante del contrato implícito para un mainmétodo de punto de entrada. Por lo tanto, no creo que debas molestarte en verificar los nullvalores de los argumentos en main. En el improbable caso 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.

Esteban C
fuente
11

Para ampliar este punto:

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

Recomiendo comprobar siempre if ((args == null) || (args.length == 0)), o if ((args != null) && (args.length > 0))según su necesidad.

Sean Crouse
fuente
0

Deberías comprobarlo (args == null || args.length == 0). Aunque la nullverificación no es realmente necesaria, es una buena práctica.

fastcodejava
fuente
1
Los controles innecesarios NO son una buena práctica. La nullverificación es innecesaria, pero tiene razón en que la lengthverificación es necesaria,
Stephen C
0

si quiero verificar si se pasa o no alguna posición específica del argumento de la línea de comando, ¿cómo verificar? como, por ejemplo, en algunos escenarios se pasarán 2 argumentos de línea de comando y en algunos solo se pasará uno, entonces, ¿cómo se verifica si se pasa o no la línea de comando específica?

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

Entonces, en el código anterior, si no se pasa args [1], obtengo java.lang.ArrayIndexOutOfBoundsException:

Entonces, ¿cómo abordo esto donde puedo verificar si el segundo argumento se aprueba o no y, si se aprueba, ingresarlo? necesita ayuda lo antes posible.

usuario4888455
fuente
Por favor, haga de esto una pregunta. Dado que no responde a la pregunta, no pertenece aquí. En cambio, si hace una pregunta, tiene muchas más posibilidades de obtener una respuesta.
AlexH
-10

Si no pasa ningún argumento, incluso en ese caso, args se inicializa pero sin ningún elemento / elemento. Prueba el siguiente, obtendrás 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);
        }

    }

Puspendu Banerjee
fuente
1
Esto es totalmente incorrecto. Si se inicia una aplicación sin argumentos de línea de comando, el mainmétodo se llamará con una argsmatriz cuya longitud es cero.
Stephen C
@Stephen Una matriz sin ningún elemento dentro, tiene una longitud cero. Entonces, ¿qué hay de malo en mi respuesta?
Puspendu Banerjee
@Puspendu: ¡lo que está mal es que dummy[0]arroja una excepción de índice de matriz fuera de los límites! Lo mismo ocurre si cambia el programa (de nuevo) a prueba args[0]y lo ejecuta sin argumentos.
Stephen C
1
OK entiendo ahora. Hubiera ayudado si no hubiera escrito mal su primera oración. Como está escrito, es ininteligible. Observo que lo corrigió en silencio en su último comentario. Furtivo.
Stephen C
1
"No he dado ninguna solución, más bien he intentado describir el problema". Entonces no publiques una respuesta. Publicar un comentario.
Stealth Rabbi