Frage

Ich habe einen Faden, in dem ich alle Fehler in einem großen Fang, umfassenden Fangblock. Ich mache das so, dass ich einen Fehler melden kann, nicht nur erwartet, ist sie sogar in meiner Anwendung. Mein Runnable sieht wie folgt aus:

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

Ich würde erwarten, dass die NPE vom Throwable catch-Block abgefangen werden. Statt dessen wird der Ausgang auf [2] nicht gedruckt, und keiner ist [3]. Der Ausgang bei [1] gedruckt ist.

Was ich auf der Konsole zu tun bekommen, ist dies:

Uncaught exception java/lang/NullPointerException.

Was auf der Erde ist denn hier los?

Für die Gerichtsakten, ich bin J2ME, und dies ist in Sun WTK v2.5.2 Emulator ausgeführt wird.

Ich bin versucht, es zu JVM Implementierung dodginess zu legen, aber ich kann das Gefühl nicht los, dass ich gerade etwas fehlt bin.

zur Vermeidung von Zweifeln zu klären (Da der Beispielcode offensichtlich von meinem Produktionscode geändert wird)

  • Es gibt nichts außerhalb des try / catch / finally in der run-Methode blockieren.
  • Es ist ein System.out.println zu Beginn jeder dieser Blöcke -. Was diese Konsole Anweisungen folgt sollte keine Rolle spielen
War es hilfreich?

Lösung

Die Antwort stellt sich heraus, dass ich ein Idiot. Ich würde erklären, was schief gelaufen ist, aber wir es nur „eine jener Fehler“ nennen.

hatte ich für einen Moment vergessen, dass der Thread, der die runnable lief eine benutzerdefinierte Thread-Klasse war (um rund einigen Nokia Bugs zu bekommen). Er rief run() wiederholt zwischen den Anrufen zu einem canWait() Verfahren.

Die canWait Methode war für das Scheitern verantwortlich, und Lauf wurde überhaupt nicht scheitern. Um das Ganze abzurunden, ich habe Konsole Blindheit und vollständig, aber aus Versehen die Abfolge der Ereignisse in meiner Frage falsch zitiert.

Andere Tipps

Klingt wie Sie einige Versuch und Irrtum müssen. Darf ich vorschlagen:

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

eine explizite Sperre zum Nullpointer Indem, sollte es offensichtlich sein, wenn die Ausnahme von innerhalb des Try-Blockes oder einem catch / finally-Block.

Okay, das ist eine wilde Vermutung ... aber es würde die Dinge erklären.

Offensichtlich hat Ihr Code ist nicht wirklich , dass - so meine Vermutung ist, dass Sie Ihren Fang (oder endlich) Block etwas entweder zu tun, bevor es etwas anmeldet, oder es verwendet ein anderer Logger als try-Block. So oder so, ich vermute, dass entweder der Haken oder der finally-Block die Ausnahme wirft.

Ich glaube nicht, dass Sie eine Stack-Trace haben ...

EDIT: Okay, wenn es nur System.out.println ist, ist es etwas, in dem Argument, das Knall gehen könnte? Zum Beispiel:

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

Wenn es nur einfach System.out.println("Constant") dann ist es sehr seltsam.

Sie wissen (zum Beispiel von Protokollzeilen innerhalb des try-Block), wie weit der try-Block ist eigentlich immer?

Wenn ich Ihren Code sah scheint es, dass sich erholen () ist eine Ausnahme zu werfen, so dass der Rat von Jon gegeben wäre sehr gut zu folgen.

Wenn Sie uns einen Stack-Trace geben können Sie helfen, besser bekommen.

Wenn ich versuche, Ausnahmen zu fangen ich etwas tun, wie folgt aus:

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

Ich mag keine Ausnahmen zu nisten, aber ich weiß nicht, wie meine catch-Block zu werfen Ausnahmen.

Wie Sie erwähnen Sie eine Runnable mit - tut dieses durch Zufall bedeuten, dass Sie auch mehrere Threads verwenden? Wenn die doUnsafeThings() intern Verfahren wieder einen anderen Thread laicht und erzeugt die Ausnahme, könnten Sie bekommen es nicht in dem Thread Ihren Fang Block ist. Siehe http: //java.sun .com / j2se / 1.5.0 / docs / api / java / lang / Thread.UncaughtExceptionHandler.html

Es ist im Allgemeinen eine schlechte Praxis Nullpointer zu fangen.

Programmierer typischerweise fangen Nullpointer unter drei Bedingungen:

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. 

Von diesen drei Fällen nur die letzte ist akzeptabel. unter diesem Link:

Fangen Nullpointer

Ist es möglich, dass der Faden durch einen anderen Code getötet wird? Im allgemeinen blockiert ein schließlich führt immer, wenn der Faden nicht normal beendet wird, entweder durch System.exit () oder etwas ähnliches.

  • Sind Sie sicher, dass Sie an der richtigen Stelle im Code suchen? Das heißt, die doUnsafeThings ist () sperren Sie in dem Stack-Trace schützen?

  • Vielleicht gibt es ein Problem mit dem Build-Methode, und Sie debuggen eine alte Version des Codes?

nur einige Protokollierung in dem doUnsafeThings () hinzuzufügen; zu sehen, ob diese Methode tut, was Sie erwarten (z stellen einen Versuch fangen endlich und melden Sie sich etwas)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top