jdk descargar actualizar java

descargar - java offline



char y int array array (4)

Cuando intento imprimir la matriz de caracteres estáticos sin inicializar, se produce un error de tiempo de ejecución (excepción del puntero nulo), mientras que la matriz de valores estáticos no inicializados da un valor nulo. ¿Por qué?

public class abc { static int arr[]; static char ch[]; public static void main(String[] args) { System.out.println(ch); //it gives null pointer exception at run time System.out.println(arr); //it gives output as "null". } }


En realidad, está llamando a dos métodos System.out.println() sobrecargados y separados. public void println(char[] x) está sobrecargado según la documentación. No existe una sobrecarga específica de println(Object x) para las matrices int[] .

Entonces, cuando se llama a println() en una matriz de enteros, se llama a public void println(Object x) . Según los Javadocs:

Este método llama primero a String.valueOf (x) para obtener el valor de cadena del objeto impreso, luego se comporta como si invocara print (String) y luego println ().

Dado que el valor de la cadena es null , el método imprime nulo.

El método println() funciona de manera algo diferente cuando toma una matriz de caracteres como parámetro. Superficialmente, el método en sí parece similar:

Imprime una matriz de caracteres y luego termina la línea. Este método se comporta como si invocara print (char []) y luego println ().

Sin embargo, el método print(char[]) se comporta de manera muy diferente en formas clave:

Imprime una matriz de caracteres. Los caracteres se convierten en bytes de acuerdo con la codificación de caracteres predeterminada de la plataforma, y ​​estos bytes se escriben exactamente a la manera del método de escritura (int).

Por lo tanto, se llama un método diferente. La documentación para print(char[]) establece explícitamente que en su situación, se lanza su excepción:

Emite: NullPointerException - Si [parámetro de entrada] s es nulo

Por lo tanto, la causa de la diferencia en el comportamiento.

Consulte Javadocs para obtener más información sobre la println y los métodos de print : http://docs.oracle.com/javase/7/docs/api/java/io/PrintStream.html#println()


Estos son dos métodos diferentes, y sus APIs describen el comportamiento completamente.

public void println(Object x) llama a String.valueOf al principio, que devuelve "null" si x es nulo.

Ver:

public void print(char[] c) llama al método print (char [] c) que lanza NullPointerException si c es nulo.

Ver:


La respuesta existe en el código fuente de PrintWriter (del cual System.out es una instancia).

Comience con el hecho de que las matrices sin inicializar, como variables de referencia, tienen el valor predeterminado null .

El println(char[]) (eventualmente) intenta llamar a .length en la matriz pasada. Es nulo, lo que da como resultado la NullPointerException . println(char[]) (eventualmente) llama a write(char[]) :

public void write(char buf[]) { write(buf, 0, buf.length); }

No hay una sobrecarga de println matching int[] , pero hay un println(Object) . Allí (eventualmente) intenta String.valueOf , pasando la referencia null , por lo que String.valueOf toma el null y devuelve la String "null" . println(Object) llamadas print(Object) :

public void print(Object obj) { write(String.valueOf(obj)); }


System.out es una instancia de PrintStream y esta clase tiene algunos métodos de println sobrecargados. En tu caso:

  1. System.out.println(ch); está utilizando public void println(char x[])
  2. System.out.println(arr); está utilizando public void println(Object x) (no hay public void println(int[] x) , por lo que el tipo más cercano disponible para int[] que println puede usar es Object ).

El segundo método es usar

String.valueOf(x);

para obtener una representación de cadena del objeto que queremos imprimir y el código del método valueOf parece

public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); }

por lo que es seguro para nulos (devolverá la cadena "null" si la referencia es null ).

El primer método está en algún nivel usando

public void write(char cbuf[]) throws IOException { write(cbuf, 0, cbuf.length); // ^^^^^^^ this throws NPE }

y porque cbuf es null cbuf.length lanzará NullPointerException porque null no tiene un campo de length (o cualquier otro).