O problema é que o String.valueOf
mé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- null
e, como null
é dado neste caso, ele será lançado NullPointerException
.
A "correção" fácil é converter o null
explicitamente da Object
seguinte 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 null
a conversão explícita para um tipo de referência específico é necessária:
- Para selecionar sobrecarga (como fornecido no exemplo acima)
- Para fornecer
null
como 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
null
neste caso), verifique se as duas sobrecargas agem da mesma forma com relação a esse valor!String.valueOf(Object)
evalueOf(char[])
fazer coisas completamente diferentes de qualquer maneira (independentemente danull
ou não) que talvez eles não deveriam ter sido sobrecargas em primeiro lugar.return null;
seria exatamente a mesma coisa quereturn (Object) null;
?O problema é que você está ligando
String.valueOf(char[])
e nãoString.valueOf(Object)
.A razão para isso é que o Java sempre escolherá a versão mais específica de um método sobrecarregado que funcione com os parâmetros fornecidos.
null
é um valor válido para umObject
parâmetro, mas também é um valor válido para umchar[]
parâmetro.Para fazer o Java usar a
Object
versão, passenull
através de uma variável ou especifique uma conversão explícita para Object:fonte
Um bug, numerado 4867608, foi registrado dessa maneira em 2003, que foi resolvido como "não será corrigido" com esta explicação.
fonte
Use
String.valueOf(null: Any)
em Scala.fonte