Pergunta

Eu pensei Java teve avaliação de curto-circuito, mas esta linha ainda está jogando uma exceção de ponteiro nulo:

if( (perfectAgent != null) && (perfectAgent.getAddress().equals(entry.getKey())) ) {

Neste caso perfectAgent é null, então eu só quero a expressão inteira para false retorno, mas meu aplicativo ainda está falhando nesta linha com uma NullPointerException.

EDIT, resposta geral:

Desde perfectAgent é null, nada à direita do && deve ser executado, uma vez que é impossível para a expressão para ser verdade. Mais ao ponto, é impossível executar perfectAgent.getAddress() desde perfectAgent não contém uma referência válida (sendo nula e tudo). Estou tentando usar a avaliação de curto-circuito para não ter de buscar por nulo em um comunicado separado como que faz com que a lógica mais desleixado.

EDIT 2 (ou, eu sou um idiota): Sim, como muitas coisas na vida que você descobrir a resposta certa depois de anunciar ao mundo que você é um idiota. Neste caso, eu tinha desligado AutoBuild do Eclipse enquanto faz outra coisa e não liguei de volta, então eu estava depurando arquivos de classe que não corresponder-se com a minha fonte.

Foi útil?

Solução

Avançado depuração lição # 1:

Se você topar com um erro aparentemente impossível (por exemplo, um que contradiz-lhe conhecimento sobre Java), faça o seguinte:

  • Consulte um livro respeitável texto (ou melhor ainda, a norma relevante) para confirmar que o seu entendimento não é falho. (Neste caso, o seu entendimento estava correto, e qualquer livro semi-decente iria confirmar isso em um minuto).

  • Verifique todas as coisas estúpidas que você poderia ter feito que poderiam causar o erro impossível. Coisas como não salvar um arquivo, não fazer uma construção completa, rodando uma versão antiga / obsoleto da aplicação, sendo no diretório errado, e assim por diante.

Em resumo, aprender a duvidar de si mesmo um pouco mais.

Outras dicas

Se perfectAgent é nulo realmente, que o código não lançar uma exceção (pelo menos assumindo que não são estranhas coisas de threading acontecendo, transformando-o de não nulo para nulo a meio do expressão). Eu seria absolutamente chocado se você poderia produzir um curto, mas completo programa de demonstrá-lo fazê-lo.

Então, sim, a sua intuição está certa - isso não deve ser um problema. Procurar outro lugar para a causa. Eu suspeito fortemente que perfectAgent não realmente nulo, e que você está executando em qualquer uma das outras situações em que o código que poderia causar uma exceção.

Eu sugiro que você tentar extrair aquele pedaço de código em um curto, mas completo exemplo - se você pode fazê-lo, eu vou comer o meu chapéu metafórica; se não, você espera encontrar o problema enquanto você tenta a extração.

O que faz você pensar que perfectAgent realmente é nulo? Tente inserir este código antes:

if (perfectAgent == null)
{
    System.out.println("Yup, it's null");
}

Outra possibilidade muito, muito magro é que você tenha que correr em um bug JIT - mas eu duvido muito.

Java faz tem avaliação de curto-circuito. Talvez entry é null e assim entry.getKey() está causando o NullPointerException. Outra possibilidade é que getAddress() tanto retornos null ou tem uma NullPointerException acontecendo dentro de algum lugar (se é mais complicado do que uma declaração return simples).

EDIT: Eu vejo a sua edição, onde você afirma o seguinte:

Mais ao ponto, é impossível executar perfectAgent.getAddress() ...

Mas o que se perfectAgent.getAddress() é executado com sucesso e volta null? Veja o que quero dizer ...

Você garantir que perfectAgent não é nulo, por isso, um ou mais dos perfectAgent.getAddress() ou entry ou entry.getKey() deve ser nulo. Ou getAddress () ou getKey () estão batendo um NPE na sua implementação.

Para depurar esse tipo de coisa, olhar primeiro para o rastreamento de pilha de definir a localização. Isso iria dizer-lhe se ele está acontecendo em getAddress () ou em getKey () ou no trecho de código colado que os chama. Em seguida, se é neste trecho, adicionar algum código antes do caso de teste que é nulo. Você pode usar o bom e velho System.err.println () ou afirmações . (Se você usar afirmações, certifique-se de permitir-lhes com a bandeira do comando java -enableassertions.)

Update: Assim, a minha interpretação acabou por ser errado ... o problema apresentado dois fatos contraditórios (havia um NPE nesta linha e ainda o curto-circuito deveria ter acontecido) e eu automaticamente assumiu o primeiro fato era verdade e a segunda falsa, quando na verdade era um problema totalmente diferente devido a desligar a auto-construção no Eclipse. Duh! Na depuração de algo "impossível" ele ajuda a ser radicalmente cético.

Existem três diferentes perfectAgent referências que poderiam ser nulo:

  • perfectAgent.getAddress ()
  • entrada
  • entry.getKey ()

quebrar a declaração ou executá-lo em um depurador.

Big mistério. Copiei a sua linha de código e testado com perfectAgent == null, entry == null, entry.getKey() == null e combinações daqueles: Não NPE na minha cama de teste (Java 1.6).

Seja qual for bug é chato, eu duvido que ele tem algo a ver com a avaliação de curto-circuito. Se é esta linha causando NPE, do que, tanto quanto eu posso dizer, perfectAgent não é nulo. Boa sorte e - mostra-nos o erro uma vez que você apanhou-o:)

Tente formatar o seu código como este:

if( 
  (perfectAgent != null) 
  && (
      perfectAgent.getAddress()
      .equals(
       entry.getKey()
      )
     ) 
  ) {

Deve dar-lhe uma melhor entrada pilha linha traço.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top