Pregunta

Tengo un hilo en el que cojo todos los errores en un grande, que todo lo abarca bloque catch. Lo hago para que pueda informar de cualquier error, no sólo esperados, en mi solicitud. Mi Ejecutable se ve así:

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] */
    }
}

Yo esperaría que el NPE a ser atrapado por el bloque catch Throwable. En lugar de ello, la salida en [2] no está impreso, y tampoco lo es [3]. La salida en [1] se imprime.

Lo que pongo en la consola, es la siguiente:

Uncaught exception java/lang/NullPointerException.

¿Qué demonios está pasando aquí?

Para los registros de la corte, estoy usando J2ME, y esto se está ejecutando en el emulador WTK v2.5.2 del solar.

Estoy tentado de dejarlo a JVM aplicación dodginess pero no puedo evitar sentir que me estoy perdiendo algo.

Para aclarar para evitar la duda (ya que el código de ejemplo es, obviamente alterada de mi código de producción)

  • No hay nada fuera del try / catch / finally en el método de ejecución.
  • Hay un System.out.println al comienzo de cada uno de esos bloques -. Lo que sigue esas declaraciones de la consola no debe importar
¿Fue útil?

Solución

La respuesta resulta que soy un idiota. Me explico lo que salió mal, pero vamos a llamarlo "uno de esos errores".

Me había olvidado momentáneamente que el hilo que corría el ejecutable era una clase de hilos personalizados (Para sortear algunos errores de Nokia). Se llama run() repetidamente entre las llamadas a un método canWait().

El método canWait era responsable del fracaso, y la carrera no estaba fallando en absoluto. Por si fuera poco, tengo la consola-ceguera y completo, pero accidentalmente mal citado la secuencia de eventos en mi pregunta.

Otros consejos

Parece que usted va a necesitar algo de ensayo y error. ¿Puedo 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...
}

Al tener una captura explícita para NullPointerException, que debería convertirse en obvio si la excepción es desde dentro del bloque try o una captura / finally.

Bueno, esto es una conjetura salvaje ... pero sería explicar las cosas.

Es evidente que su código no es realmente que - así que yo creo es que su captura (o fin) bloque está bien hacer algo antes de que se registra nada, o se utiliza un registrador diferente que el bloque try. De cualquier manera, sospecho que, o bien la captura, o por último bloque está lanzando la excepción.

No suponga que tiene un seguimiento de pila ...

EDIT: Bueno, si es sólo System.out.println, es que algo en el argumento de que podría ir Bang? Por ejemplo:

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

Si se trata de una simple System.out.println("Constant") entonces es muy raro.

¿Conoce usted (por ejemplo, de líneas de registro dentro del bloque try) hasta qué punto el bloque try está consiguiendo realmente?

Cuando vi su código parece que se recuperan () es una excepción, por lo que el consejo dado por Jon sería excelente para seguir.

Si usted nos dio un seguimiento de pila puede obtener una mejor ayuda.

Cuando intento capturar las excepciones que hago algo como esto:

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

No me gustan las excepciones al nido, pero no me gusta que mis captura excepciones bloque de lanzamiento.

Como se menciona que está utilizando un Runnable - hace esto, por casualidad, significa que está utilizando múltiples hilos así? Si el método doUnsafeThings() genera internamente un hilo diferente otra vez y que produce la excepción, que no podría obtener en el hilo de su bloque catch es. Ver http: //java.sun .com / j2se / 1.5.0 / docs / api / java / lang / Thread.UncaughtExceptionHandler.html

En general, es una mala práctica de atrapar NullPointerException.

Los programadores suelen ponerse NullPointerException en tres circunstancias:

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. 

De estas tres circunstancias, sólo la última es aceptable. siguiendo este enlace:

Catch NullPointerException

¿Es posible que el hilo está siendo asesinada por algún otro código? En general, un bloque finally siempre se ejecuta a menos que el hilo se termina anormalmente, ya sea por System.exit () o algo similar.

  • ¿Seguro que está buscando en el lugar correcto en el código? Es decir, es la doUnsafeThings () bloquean está protegiendo en el seguimiento de la pila?

  • Tal vez hay un problema con el método de aumento, y se depura una versión antigua del código?

acaba de añadir un poco de la tala en las doUnsafeThings (); para ver si ese método se realiza lo que espera (por ejemplo poner un intento de captura por último y registrar algo)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top