El problema es que el String.valueOf
método está sobrecargado :
Java Specification Language exige que en este tipo de casos, se elija la sobrecarga más específica :
Si más de un método miembro es accesible y aplicable a una invocación de método, es necesario elegir uno para proporcionar el descriptor para el envío del método en tiempo de ejecución. El lenguaje de programación Java usa la regla de que se elige el método más específico .
A char[]
es-an Object
, pero no todo Object
es-a char[]
. Por lo tanto, char[]
es más específico que Object
, y según lo especificado por el lenguaje Java, la String.valueOf(char[])
sobrecarga se elige en este caso.
String.valueOf(char[])
espera que la matriz no sea null
, y dado que null
se da en este caso, entonces arroja NullPointerException
.
La "solución" fácil es emitir null
explícitamente Object
lo siguiente:
System.out.println(String.valueOf((Object) null));
// prints "null"
Preguntas relacionadas
Moraleja de la historia
Hay varios importantes:
- Efectivo Java 2nd Edition, Artículo 41: Use la sobrecarga juiciosamente
- El hecho de que pueda sobrecargarse no significa que deba hacerlo siempre
- Pueden causar confusión (especialmente si los métodos hacen cosas muy diferentes)
- Usando un buen IDE, puede verificar qué sobrecarga se selecciona en tiempo de compilación
- Con Eclipse, puede pasar el mouse sobre la expresión anterior y ver que , de hecho , ¡la
valueOf(char[])
sobrecarga está seleccionada!
- A veces quieres emitir explícitamente
null
(ejemplos a seguir)
Ver también
En casting null
Hay al menos dos situaciones en las null
que es necesario emitir explícitamente a un tipo de referencia específico:
- Para seleccionar la sobrecarga (como se muestra en el ejemplo anterior)
- Para dar
null
como argumento único a un parámetro vararg
Un ejemplo simple de esto último es el siguiente:
static void vararg(Object... os) {
System.out.println(os.length);
}
Entonces, podemos tener lo siguiente:
vararg(null, null, null); // prints "3"
vararg(null, null); // prints "2"
vararg(null); // throws NullPointerException!
vararg((Object) null); // prints "1"
Ver también
Preguntas relacionadas
null
en este caso), ¡asegúrese de que ambas sobrecargas actúen de la misma manera con respecto a ese valor!