2012-09-10 9 views
8

Estoy un poco confundido por algo. Escribí un pequeño fragmento de código.java args array en el método main() confusión (verificación nula)

import java.util.*; 
class AA 
{ 
    public static void main(String args[]) 
    { 
    if(args == null) 
    { 
      System.out.println("I am null"); 
    } 
    else{ 
      System.out.println(args); 
     } 
} 
} 

Es una prueba simple. Aunque no estoy pasando nada desde la línea de comandos como argumento, pero aún así args no es nulo, lo que significa que JVM lo inicializa en algo así como String array. ¿Por qué alguna razón específica detrás de esto? Tengo curiosidad por saber. Cualquier indicador será de ayuda. Gracias, Ben

+0

posible duplicado de (http://stackoverflow.com/questions/9605532/args-guaranteed-to-be-non-null), http [Args garantiza que sea no nulo?]: // programadores. stackexchange.com/questions/120355/is-it-better-to-return-null-or-empty-values-from-functions-method s-where-the-ret –

Respuesta

6

Cuando no pasa nada, el args no es null - Es vacío:

if(args.length == 0) 
{ 
     System.out.println("I am empty"); 
} else{ 
     System.out.println(args); 
} 
+2

¿Se indica este comportamiento en cualquier parte de la especificación de idioma? ¿Alguna referencia? – kosa

+0

args es una matriz y representa los argumentos de la línea de comando, y siempre es inicializada por la JVM (en la inicialización del programa cuando se llama a main), por lo que la matriz nunca será nula ... – aleroot

+1

@Nambari Estaba buscando eso, también, pero no pude encontrar una respuesta definitiva: en la sección 12.1 dicen que "La manera en que se especifica la clase inicial para la máquina virtual Java está fuera del alcance de esta especificación, pero es típico, en entornos host que utilice líneas de comando, para que el nombre totalmente calificado de la clase se especifique como un argumento de línea de comandos y para que los siguientes argumentos de línea de comando se usen como cadenas para proporcionarse como el argumento del método main ", y no proporcionan más detalles. Así que supongo que agregar una verificación 'null' puede ser una buena idea. – dasblinkenlight

0

crea la JVM y pasa todos los argumentos como una cadena [] args con nombre" ". Esto se hace (entre otras razones) para que no tengamos que verificar nulo en el objeto args. Es algo pequeño pero ahorra una pequeña cantidad de tiempo.

+0

Hola, eso es muy útil. Lo conseguí y la curiosidad se resolvió. Gracias una tonelada. – benz

1

El argumento del método main consistirá en los parámetros de cadena pasados ​​desde la línea de comando. Si se pasa ninguno, todavía no se null pero tendrá un tamaño de 0. Haga la prueba:

public static void main(String[] args) { 
    System.out.println(args[0]); 
} 

Se puede ver que se produce una excepción:

 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 
4

Es semántica. Si no hay argumentos, significa que su lista de argumentos está vacía, no significa que la noción de argumentos no existe. Por lo tanto, la lista args es una matriz vacía (es decir, sin argumentos) en lugar de una nula (es decir, los argumentos no existen).

+0

Gracias una tonelada privat. Entendí. Fue una explicación realmente útil. – benz

0

comprueba el tamaño de la matriz de cadenas args, si es cero que no hay nada en ella, y si el tamaño es mayor que 1 que hay algo en ella, intenta poner un punto de interrupción (si usas IDE) o iterar sobre la matriz, para ver los contenidos de la matriz.

1

su cuenta de cheques para la matriz nula no es malo si no fuera por el hecho de que la matriz args pasado a la función main de un programa Java es cada vez inicializado por la propia máquina virtual Java, por lo que la matriz nunca será nulo, solo puede estar vacío pero no nulo. La JVM garantiza que la matriz args se inicializará. La comprobación de null aún no está mal, pero es redundante y no tiene mucho sentido, especialmente no tiene el sentido que usted le dio (ningún argumento pasó en la línea de comando).

Desde será siempre inicializa la matriz, puede estar seguro de que va a ser no nulo y realizar sólo la verificación vacía:

if(argsl.length == 0) { 
//Is empty 
} 

e incluso se puede repetir directamente a través de la matriz sin preocuparse de NullPointerException:

for(String arg : args) { 
    System.out.println(arg); 
} 
+0

Gracias esa fue una explicación más lógica. – benz

+0

"La JVM garantiza que la matriz args se inicializará" ¿Podría proporcionar alguna referencia a esto? Realmente estamos buscando documentación oficial. – kosa

+0

@Nambari ¿alguna vez ha visto un parámetro de matriz args de la función principal de un programa JAva nulo? Yo no ... – aleroot

Cuestiones relacionadas