O problema é que o String.valueOfmétodo está sobrecarregado :
A Java Specification Language exige que, nesses tipos de casos, a sobrecarga mais específica seja escolhida:
Se mais de um método membro for acessível e aplicável a uma chamada de método, será necessário escolher um para fornecer o descritor para o envio do método em tempo de execução. A linguagem de programação Java usa a regra de que o método mais específico é escolhido.
Um char[] é um Object , mas nem todos Object é um char[] . Portanto, char[]é mais específico do que Object, e conforme especificado pela linguagem Java, a String.valueOf(char[])sobrecarga é escolhido neste caso.
String.valueOf(char[])espera que o array seja não- nulle, como nullé dado neste caso, ele será lançado NullPointerException.
A "correção" fácil é converter o nullexplicitamente da Objectseguinte maneira:
System.out.println(String.valueOf((Object) null));
// prints "null"
Perguntas relacionadas
Moral da história
Existem vários importantes:
- Java eficaz 2ª edição, item 41: use sobrecarga criteriosamente
- Só porque você pode sobrecarregar, não significa que você deveria sempre
- Eles podem causar confusão (especialmente se os métodos fizerem coisas muito diferentes)
- Usando um bom IDE, você pode verificar qual sobrecarga está selecionada no momento da compilação
- Com o Eclipse, você pode passar o mouse sobre a expressão acima e ver que , de fato , a
valueOf(char[])sobrecarga está selecionada!
- Às vezes você deseja transmitir explicitamente
null(exemplos a seguir)
Veja também
Na fundição null
Há pelo menos duas situações em que nulla conversão explícita para um tipo de referência específico é necessária:
- Para selecionar sobrecarga (como fornecido no exemplo acima)
- Para fornecer
nullcomo argumento único um parâmetro vararg
Um exemplo simples deste último é o seguinte:
static void vararg(Object... os) {
System.out.println(os.length);
}
Então, podemos ter o seguinte:
vararg(null, null, null); // prints "3"
vararg(null, null); // prints "2"
vararg(null); // throws NullPointerException!
vararg((Object) null); // prints "1"
Veja também
Perguntas relacionadas
nullneste caso), verifique se as duas sobrecargas agem da mesma forma com relação a esse valor!