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:
- http://docs.oracle.com/javase/8/docs/api/java/lang/String.html#valueOf-java.lang.Object-
- http://docs.oracle.com/javase/8/docs/api/java/io/PrintStream.html#println-java.lang.Object-
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:
-
System.out.println(ch);
está utilizandopublic void println(char x[])
-
System.out.println(arr);
está utilizandopublic void println(Object x)
(no haypublic void println(int[] x)
, por lo que el tipo más cercano disponible paraint[]
queprintln
puede usar esObject
).
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).