String x = (String) null;
Por que não há exceção nesta declaração?
String x = null;
System.out.println(x);
Imprime null
. Mas o .toString()
método deve lançar uma exceção de ponteiro nulo.
String x = (String) null;
Por que não há exceção nesta declaração?
String x = null;
System.out.println(x);
Imprime null
. Mas o .toString()
método deve lançar uma exceção de ponteiro nulo.
Respostas:
Você pode converter
null
para qualquer tipo de referência sem obter nenhuma exceção.O
println
método não lança ponteiro nulo porque primeiro verifica se o objeto é nulo ou não. Se nulo, simplesmente imprime a string"null"
. Caso contrário, ele chamará otoString
método desse objeto.Adicionando mais detalhes: Os métodos de impressão interna chamam o
String.valueOf(object)
método no objeto de entrada. E, novalueOf
método, essa verificação ajuda a evitar a exceção de ponteiro nulo:Para o resto da sua confusão, chamar qualquer método em um objeto nulo deve gerar uma exceção de ponteiro nulo, se não for um caso especial.
fonte
Você pode converter
null
para qualquer tipo de referência. Você também pode chamar métodos que manipulam anull
como argumento, por exemploSystem.out.println(Object)
, mas não pode fazer referência a umnull
valor e chamar um método nele.BTW Há uma situação complicada em que parece que você pode chamar métodos estáticos em
null
valores.fonte
t.yield() -> Thread.yeld()
assim mesmo? Semelhante a comofinal int i = 1; while (i == 1)
é otimizado parawhile(true)
Isso é por design. Você pode converter
null
para qualquer tipo de referência. Caso contrário, você não seria capaz de atribuí-lo a variáveis de referência.fonte
A conversão de valores nulos é necessária para a construção a seguir, em que um método está sobrecarregado e se nulo é passado para esses métodos sobrecarregados, o compilador não sabe como esclarecer a ambiguidade, portanto, precisamos tipular nulo nesses casos:
Caso contrário, você não poderá chamar o método necessário.
fonte
String bar = null;
lança onull
valor paraString
. Até o momento, tive apenas que converter nulo explicitamente em um teste em que um método estava sobrecarregado e queria testar seu comportamento com entrada nula. Ainda assim, é bom saber que eu estava prestes a escrever uma resposta semelhante antes de encontrar a sua.l instanceof Long
es instanceof String
retornaráfalse
nesses casos.Println(Object)
usaString.valueOf()
Print(String)
faz verificação nula.fonte
Muitas respostas aqui já mencionam
e
Gostaria de saber onde isso é especificado e procurei a especificação Java:
A referência nula sempre pode ser atribuída ou convertida para qualquer tipo de referência (§5.2, §5.3, §5.5).
Se a referência for nula, ela será convertida na cadeia "nula" (quatro caracteres ASCII n, u, l, l).
fonte
Como outros escreveram, você pode converter nulo para tudo. Normalmente, você não precisa disso, pode escrever:
sem colocar o elenco lá.
Mas há ocasiões em que esses elencos fazem sentido:
a) se você deseja garantir que um método específico seja chamado, como:
então faria diferença se você digitar
b) se você pretende usar seu IDE para gerar código; por exemplo, estou escrevendo testes de unidade como:
Eu estou fazendo TDD; isso significa que a classe "MyClassUnderTest" provavelmente ainda não existe. Ao escrever esse código, posso usar meu IDE para gerar primeiro a nova classe; e, em seguida, gerar um construtor aceitando um argumento "Whatever" "pronto para uso" - o IDE pode descobrir, pelo meu teste, que o construtor deve usar exatamente um argumento do tipo Whatever.
fonte
Impressão :
ValorDe :
Ele simplesmente retornará uma string com o valor "null" quando o objeto estiver
null
.fonte
Isso é muito útil ao usar um método que seria ambíguo. Por exemplo: JDialog possui construtores com as seguintes assinaturas:
Preciso usar esse construtor, porque quero definir o GraphicsConfiguration, mas não tenho pai para esse diálogo, portanto, o primeiro argumento deve ser nulo. Usando
é ambíguo, portanto, neste caso, posso restringir a chamada convertendo nulo para um dos tipos suportados:
fonte
Esse recurso de idioma é conveniente nessa situação.
Se memberHashMap.get ("Name") retornar nulo, você ainda desejará que o método acima retorne nulo sem gerar uma exceção. Não importa qual seja a classe, null é null.
fonte