El problema es que el String.valueOfmé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 nullse da en este caso, entonces arroja NullPointerException.
La "solución" fácil es emitir nullexplícitamente Objectlo 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 nullque 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
nullcomo 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
nullen 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 denullo 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.
nulles un valor válido para unObjectparámetro, pero también es un valor válido para unchar[]parámetro.Para hacer que Java use la
Objectversión, pase anulltravé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