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!String.valueOf(Object)
yvalueOf(char[])
hace cosas completamente diferentes de todos modos (independientemente denull
o no) que tal vez no deberían haber sido sobrecargas en primer lugar.return null;
sería exactamente la misma quereturn (Object) null;
?El problema es que estás llamando
String.valueOf(char[])
y noString.valueOf(Object)
.La razón de esto es que Java siempre elegirá la versión más específica de un método sobrecargado que funcione con los parámetros proporcionados.
null
es un valor válido para unObject
parámetro, pero también es un valor válido para unchar[]
parámetro.Para hacer que Java use la
Object
versión, pase anull
través de una variable o especifique una conversión explícita a Object:fuente
Un error, con el número 4867608, se archivó de esta manera en 2003, que se resolvió como "no solucionará" con esta explicación.
fuente
Uso
String.valueOf(null: Any)
en Scala.fuente