Por que meu NullPointerException não ser pego no meu bloco catch?

votos
3

Eu tenho um segmento em que eu pegar todos os erros em um grande abrangente bloco, captura. Eu faço isso para que eu possa relatar qualquer erro, não apenas as esperadas, em meu aplicativo. Meu Runnable parece com isso:

public final void run()
{
    try
    {
        System.out.println(Do things); /* [1] */

        doUnsafeThings();
    }
    catch (Throwable t)
    {
        System.out.println(Catch); /* [2] */

        recover();
    }
    finally
    {
        System.out.println(Finally); /* [3] */
    }
}

Espero que o NPE a ser capturado pelo bloco captura Throwable. Em vez disso, a saída em [2] não é impresso, e nem é [3]. A saída em [1] é impresso.

O que eu recebo no console, é esta:

Uncaught exception java/lang/NullPointerException.

o que esta acontecendo aqui?

Para os registros do tribunal, eu estou usando J2ME, e este está em execução no emulador WTK v2.5.2 do Sol.

Estou tentado a colocá-lo para baixo a JVM implementação dodginess mas não posso deixar de sentir que eu estou faltando alguma coisa.

Para esclarecer para que não restem dúvidas (Desde que o código de exemplo é obviamente alterada do meu código de produção)

  • Não há nada fora do try / catch / finally bloquear no método run.
  • Há um System.out.println no início de cada um desses blocos - O que se segue essas declarações de console não deve importar.
Publicado 22/04/2009 em 12:32
fonte usuário
Em outras línguas...                            


9 respostas

votos
6

A resposta Acontece que eu sou um idiota. Eu explicar o que deu errado, mas vamos chamá-lo de "um daqueles erros".

Eu tinha esquecido momentaneamente que o fio que corria o executável foi uma classe Thread personalizado (Para contornar alguns bugs da Nokia). É chamado run()repetidamente entre as chamadas para um canWait()método.

O método canWait foi responsável pelo fracasso, e correr não estava falhando em tudo. Para cobri-lo fora, eu tenho consola-cegueira e completamente, mas acidentalmente citado erroneamente a sequência de acontecimentos na minha pergunta.

Respondeu 22/04/2009 em 14:16
fonte usuário

votos
5

Parece que você vai precisar de alguma tentativa e erro. Posso sugerir:

try {
    doEvilStuff();
} catch (NullPointerException ex) { 
    System.out.println("NPE encountered in body"); 
} catch (Throwable ex) {
    System.out.println("Regular Throwable: " + ex.getMessage());
} finally {
    etc...
}

Por ter uma captura explícita para NullPointerException, deveria ser óbvio, se a exceção é de dentro do bloco try ou um bloco finally / catch.

Respondeu 22/04/2009 em 12:54
fonte usuário

votos
4

Ok, isso é um palpite ... mas seria explicar as coisas.

Obviamente, seu código não é verdade que - por isso o meu palpite é que a sua captura (ou finalmente) bloco é tanto fazer algo antes que registra nada, ou ele usa um registrador diferente do bloco try. De qualquer maneira, suspeito que tanto a captura ou o último bloco é lançar a exceção.

Eu não suponho que você tem um rastreamento de pilha ...

EDIT: Ok, se é apenas System.out.println, é algo no argumento de que poderia ir bater? Por exemplo:

catch (Throwable t) {
    // Will go bang if t.getCause() returns null
    System.out.println(t.getCause().getMessage());
}

Se é apenas simples System.out.println("Constant"), então é muito estranho.

Sabe (por exemplo, de log linhas dentro do bloco try) quanto o bloco try está realmente ficando?

Respondeu 22/04/2009 em 12:46
fonte usuário

votos
2

Como você menciona que você está usando um Runnable- isso se por acaso significa que você está usando vários segmentos também? Se o doUnsafeThings()método gera internamente um segmento diferente de novo e que produz a exceção, você não pode obtê-lo no segmento de seu bloco catch é. veja http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.UncaughtExceptionHandler.html

Respondeu 22/04/2009 em 14:11
fonte usuário

votos
2

Quando olhei para o seu código parece que recuperar () é lançar uma exceção, então o conselho dado por Jon seria excelente a seguir.

Se você nos deu um rastreamento de pilha que você pode obter uma melhor ajuda.

Quando eu tento capturar exceções eu fazer algo assim:

try {
  doSomethingBad();
} catch(Exception e) {
   try {
      LogException(...);
   } catch(Exception e) {}       
} finally {
}

Eu não gosto de exceções ninho, mas eu não gosto de meus capturar exceções bloco de arremesso.

Respondeu 22/04/2009 em 13:06
fonte usuário

votos
1

Em geral, é uma má prática para pegar NullPointerException.

Os programadores tipicamente pegar NullPointerException sob três condições:

The program contains a null pointer dereference. Catching the resulting exception was easier than fixing the underlying problem.
The program explicitly throws a NullPointerException to signal an error condition.
The code is part of a test harness that supplies unexpected input to the classes under test. 

Destes três circunstâncias, apenas o último é aceitável. seguindo este link:

NullPointerException captura

Respondeu 17/11/2012 em 06:30
fonte usuário

votos
0

basta adicionar alguns logging nos doUnsafeThings (); para ver se esse método é fazer o que você espera (por exemplo, colocar um try catch finalmente e log algo)

Respondeu 22/04/2009 em 14:01
fonte usuário

votos
0
  • Tem certeza de que está procurando no lugar certo no código? Ou seja, é o doUnsafeThings () bloco que você está protegendo em do rastreamento de pilha?

  • Talvez haja um problema com o seu método de construção, e você está depurando uma versão antiga do código?

Respondeu 22/04/2009 em 13:10
fonte usuário

votos
0

É possível que o segmento está sendo morto por algum outro código? Em geral, um bloco finally sempre executa a menos que o segmento está terminada anormalmente, quer por System.exit () ou algo similar.

Respondeu 22/04/2009 em 12:40
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more