Wie bekomme ich diese Ausnahme in Swing?

8

Ich habe eine Swing-Anwendung, und obwohl ich alles in try / block habe, wird die Ausnahme nicht abgefangen.

%Vor%

alles, was ich bekomme, ist diese Stack-Trace:

%Vor%     
feiroox 11.04.2009, 16:57
quelle

5 Antworten

10

Wie von einem anderen Poster erwähnt, besteht Ihr Problem darin, dass die Ausnahme in einem anderen Thread, dem Ereignisversand-Thread, ausgelöst wird. Ein paar Lösungen:

  • Versuchen Sie, den tatsächlichen Code zu erfassen, in dem die Ausnahme auftritt: z. Wenn es sich um einen Klick auf eine Schaltfläche handelt, die von einem ActionListener bearbeitet wird, setzen Sie try / catch in Ihre actionPerformed () -Methode;
  • oder, belassen Sie die Ausnahme als nicht abgefangene Ausnahme und fügen Sie einen nicht abgefangenen Ausnahmebehandler hinzu. Zum Beispiel:
%Vor%

Als Randnotiz sollten Sie im Prinzip aber Ihren UI-Startup-Code in einem SwingUtilities.invokeLater () .

    
Neil Coffey 11.04.2009, 18:35
quelle
2

Swing führt Dinge im Event-Thread aus. Sie versuchen, es im Hauptthread abzufangen.

Und beachten Sie, dass Swing nicht threadsicher ist, Sie sollten auch Dinge im Ereignis-Thread tun.

Um die Ausnahme abzufangen, können Sie eine Methode aus dieser Stapelverfolgung überschreiben, wie die paint-Methode Ihrer Komponente.

Und für mich sieht diese Ausnahme wie ein Fehler aus, den Sie beheben sollten, nicht etwas, das Sie verstecken sollten, indem Sie fangen.

    
iny 11.04.2009 17:08
quelle
2

Laufzeitausnahmen wie ArrayIndexOutOfBoundsException zeigen einen Programmierfehler. Also könnte es besser sein, sie zu reparieren, anstatt sie zu fangen und still zu kauen.

Nur eine wilde Vermutung für die Ursache der Ausnahme. Etwas entfernt gleichzeitig Zeilen aus dem Datenvektor des Tabellenmodells, sobald die JTable beginnt, die Daten auf dem Bildschirm zu zeichnen.

    
Manoj 11.04.2009 22:49
quelle
1

Die einzigen geeigneten Möglichkeiten, die ich kenne, um Ausnahmen, die aus dem EDT geworfen werden, abzufangen sind:

  • schreibe deine eigene EventQueue (ich würde nicht schreiben beraten Sie es im Allgemeinen)
  • benutze Swing interne Eigenschaft " sun.awt.exception.handler " (Ich benutze es und es funktioniert auf allen Sun JDK 1.4, Mindestens 1,5 und 1,6, plus mindestens IBM JDK 1.4 und 1.5; Ich habe es auf anderen JDK nicht überprüft, obwohl)

Sie sollten sich diesen Thread genauer ansehen Überblick über die Lösungen mit ihren Vor- und Nachteilen.

    
jfpoilpret 13.04.2009 01:59
quelle
0

Wie oben erwähnt, besteht das Problem darin, dass die Ausnahme ausgelöst wird - für den Ereignisversand-Thread.

Wenn Sie einen try / catch-Block einrichten möchten, um dieses spezielle Problem zu beheben, würde ich einen in die Paint-Methode der App-Klasse werfen. Überschreibe es und rufe superpaint in einem try catch block auf.

Wenn Sie eine generische Möglichkeit haben möchten, nicht abgefangene Ausnahmen abzufangen, sehen Sie sich Thread.setUncaughtExceptionHandler . Sie rufen diese Methode mit einem Ausnahmebehandler auf, und Sie können mit allen Ausnahmen umgehen, die nicht in Ihrer Anwendung gefangen werden.

    
deterb 11.04.2009 20:19
quelle

Tags und Links