JComponent -> java.lang.NullPointerException

123456789

Aktives Mitglied
Hallo,

ich arbeite zur Zeit an einer graphischen Oberfläche und während eines JUnit Test durchlaufs wird die folgende Exception geworfen. Im Testdurchlauf werden nur Daten innerhalb der JTable geändert und die entsprechenden Abhänigkeiten überprüft.

Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at javax.swing.JComponent._paintImmediately(Unknown Source)
	at javax.swing.JComponent.paintImmediately(Unknown Source)
	at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
	at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
	at javax.swing.RepaintManager.seqPaintDirtyRegions(Unknown Source)
	at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

Besonders merkwürdig finde ich, dass die Exception nicht bei jedem Testdurchlauf geworfen wird, sondern nur sporadisch.
Kann mir bitte jemand einen Tipp geben, wie man an so ein Problem herangeht, bzw. damit umgeht?
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Schwer zu sagen... aber ... die Tabelle ist währenddessen NICHT sichtbar? (Könnte damit zusammenhängen, wäre aber auch schon seltsam...)
 

123456789

Aktives Mitglied
Danke Marco, für deine Antwort

was mich noch interessiert ist, ob ich das Auftreten solch einer Exception ignorieren kann, oder versuchen soll, den Grund dafür zu finden?
Denn die Exception tritt ja nicht immer auf!

Vielen Dank
 

Marco13

Top Contributor
Najaaaa... JComponent._paintImmediately ist eine SO interne Methode, dass man davon ausgehen könnte, dass das nichts ist, was auch nur Ansatzweise mit diesem (oder irgendeinem!) Unit-Test abgedeckt wird. Vermutlich ist es wirklich nur ein Artefakt.
Eigentlich würde ich meinen, dass es auch daher kommen könnte, dass die Sachen NICHT auf dem EDT gemacht werden, aber der Stack Trace sieht anders aus ... bin mir gerade nicht sicher... Machst du die Änderungen an der JTable und dem TableModel NUR auf dem EDT?
 

123456789

Aktives Mitglied
Der UnitTest initialisiert zuerst das gesamte GUI, und alle weiteren Operationen erfolgen auf Datenmodellebene. Events werden vom Test keine generiert. Aus meiner Sicht gesehen dürfte dann der EDT auch nicht mit Anweisungen aus dem Swing Framework gefüllt werden. Oder?
Was mich wirklich erstaunt ist, dass diese Exception wirklich nur hin und wieder auftritt (ca. bei jedem 10 Test. und dann genau 2 mal ???:L )

Danke,
 

Marco13

Top Contributor
Es ging um die Frage, ob du irgendwo sowas machst wie table.setValueAt, und dieser Aufruf NICHT aus dem EDT gemacht wird. Wenn irgendein anderer Thread das macht, könnte(!) das zu solchen Problemen führen.
 

twseitex

Mitglied
Hier ein Beispiel, das mir passiert ist unter Java SE - eventuell ein Analogon

Es wird ein Vordergrundbild animiert per Routine, die rekursiv im Thread läuft
und dort ausführt createImage(....);



Exception in thread "Thread-10" java.lang.StackOverflowError
at java.util.Hashtable.put(Unknown Source)
at sun.java2d.Disposer.add(Unknown Source)
at sun.java2d.Disposer.addRecord(Unknown Source)
at sun.awt.image.BufImgSurfaceData.initRaster(Native Method)
at sun.awt.image.BufImgSurfaceData.createDataIC(Unknown Source)
at sun.awt.image.BufImgSurfaceData.createData(Unknown Source)
at sun.awt.image.CachingSurfaceManager.<init>(Unknown Source)
at sun.java2d.d3d.D3DCachingSurfaceManager.<init>(Unknown Source)
at sun.java2d.SurfaceManagerFactory.createCachingManager(Unknown Source)
at sun.awt.image.OffScreenImage.createSurfaceManager(Unknown Source)
at sun.awt.image.OffScreenImage.initSurfaceManager(Unknown Source)
at sun.awt.image.OffScreenImage.<init>(Unknown Source)
at sun.awt.Win32GraphicsConfig.createAcceleratedImage(Unknown Source)
at sun.awt.windows.WComponentPeer.createImage(Unknown Source)
at java.awt.Component.createImage(Unknown Source)
at java.awt.Component.createImage(Unknown Source)
at java.awt.Component.createImage(Unknown Source)
at java.awt.Component.createImage(Unknown Source)
at java.awt.Component.createImage(Unknown Source)

Obwohl StackOverflowError KEINE Exception ist, erklärt Java den
Error zur Exception. Aber NUR Exception sind vom Programmierer
behandelbar. Error sind Stati der Virtuellen Maschine und unbehandelbar.

Der Grund für Exception ist folgender:
java.util.Hashtable.put(Unknown Source) hat NullpointerException von .put()

Wer jetzt hofft, dass die ERSTE Gefundene Nullpointer-Ausnahme

abfangbar ist, ohne das Stackoverflowerror entsteht, der irrt, denn
Stackoverflowerror kommt vor dem Nullpointer, so dass mit
Nullpointer der Thread bereits gecrasht ist.


try-catch wird bei Stackoverflow nicht mehr abgearbeitet
 

VfL_Freak

Top Contributor
Moin,

Der Grund für Exception ist folgender:
java.util.Hashtable.put(Unknown Source) hat NullpointerException von .put()
Zeig doch mal den relevanten Code ....

try-catch wird bei Stackoverflow nicht mehr abgearbeitet
Das ist klar, wenn Dein Speicher voll ist, dan geht nichts mehr ....
Probier mal den Parameter -Xss4M (setzt den Stack pro Thread auf 4 MB), kann natürlich variiert werden.

Aber ich denke mal, dass das eigentliche Problem schon früher auftritt!

Gruß
Klaus
 
S

SlaterB

Gast
Obwohl StackOverflowError KEINE Exception ist, erklärt Java den
Error zur Exception. Aber NUR Exception sind vom Programmierer
behandelbar. Error sind Stati der Virtuellen Maschine und unbehandelbar.
'Exception' ist hier doch nur eine Ausgabe, ein Log, ob da nun 'Error' oder 'Exception' steht..

und gerade dieser StackOverflowError ist doch wohl behandelbar? als der Stack voll war schmiss Java den Error, die Methodenkette wurde durchbrochen,
jetzt ist der Stack wieder leer, das Programm in einem so guten Zustand wie jedes andere auch,
das Fehler ist behandelbar, das Programm darf weiterlaufen, man sollte sich nur bis zum nächsten Update merken, Knopf X nicht mehr zu klicken ;)
 

Ebenius

Top Contributor
Du initialisierst Deine GUI im JUnit-Test. Mach das doch auf dem EDT und guck mal, ob der Fehler dann weg ist. In etwa:
Java:
try {
  SwingUtilities.invokeAndWait(new Runnable() {
    @Override
    public void run() {
      initializeGUI();
    }
  });
} catch (InterruptedException ex) {
  System.err.println("JUnit test has been interrupted");
  Thread.currentThread().interrupt();
}
HTH, Ebenius
 

twseitex

Mitglied
Hi,

Das Problem aus meinem Beispiel habe ich gelöst. Es sollte nur eine Anregung sein.

Threads müssen explizit so kodiert werden, dass Speicher nicht kumulativ
gefüllt wird (z.B. klassenglobale Variablen nutzen im Thread, Threads vor
Parallelaufruf schützen, Speicher im Thread erzeugt auch dort aufräumen,
möglichst keine Parameter der Funktionen).
Die Speichereinstellung per Parameter habe ich explizit weggelassen, da
das Applet so wie das jeweilige Java SE vorsieht, laufen soll (welcher
Standarduser kann Java konfigurieren ..)

Den Quellcode zu diesem Fehler kann ich nicht hier angeben, da zu komplex:
Es laufen 3 Klassen parallel, die jeweils eigene Threadverwaltung haben und
sich synchronisieren müssen. Wer die JAR rekompiliert, erhält den Quellcode
aber ohne Kommentare.

Das Applet ist ein Javaplayer für Audio mit Bildanimation und konfigurierbarer
GUI - also laufen die Appletklasse, die GUI-Klasse und die Audioklasse parallel
und werden synchronisiert (alle diese Klassen haben je Unterklassen). Und Java
räumt Audio- und GUI-Klasse nicht synchron auf: Die Audioklasse braucht länger
als das Entsorgen der GUI. Beide Klassen laufen mit mehreren getrennten Threads,
wobei ein dritter Thread synchronisiert (Aktionen der Klassen aktivieren lässt).

Was mir also nicht gelungen ist: Wenn das Applet endet, dann sollten
die 3 Klassen synchron enden - tun sie aber nicht, da Java SE aufräumt, wann es will.
Ich vermute: Parallele Threads und Ressourcen sind der Grund, so dass
irgendwann ein o.g. Fehler auftritt, wenn man Threads nicht gründlich genug
programmiert und jede Fehlerquelle ausschliesst.

Das Applet findet man auf meiner Webseite twseiten.com (audio, flash and java).
Interessant ist übrigens, dass der MS Internet Explorer 8 wieder mal zickig ist
(so wie bei Flash (Flash-Player auch auf der Webseite zu finden)).
Die dynmamische Ansteuerung des Applets per Javascript ist ebenfalls
etwas zickig.

Cu.
 

123456789

Aktives Mitglied
Hallo, und danke für eure Antworten.

@Marco13: setValue wird definitiv im JUnittest aufgerufen. Danke das könnte die Ursache sein.

@Ebenius: Ich hab das jetzt mit SwingUtilities versucht, und seitdem ist der Fehler nicht mehr aufgetreten. Ich denk das war die Lösung für mein Problem.

Jetzt hab ich nur noch eine Bitte. Kann mir jemand erklären was

SwingUtilities.invokeAndWait(new Runnable() und auch
SwingUtilities.invokeLater(new Runnable()

genau macht. Bitte nur eine einfache Erklärung.

Vielen Dank! :)
 

Marco13

Top Contributor
Das mit den SwingUtilities war das, was aus meinen Fragen zum EDT oben folgte ;) Aber um weiter auzuholen: JEDE Operation, die den Zustand einer Swing-Component verändert (oder vom aktuellen Zustand abhängt) muss vom Event-Dispatch-Thread (EDT) gemacht werden. Der EDT ist praktisch der "Haupt-Thread" von Swing, der sich um Benutzereingaben, Zeichnen und alles andere GUI-spezifische kümmert (siehe auch Threads and Swing )

Mit SwingUtilties.invoke... wird sichergestellt, dass as übergebene Runnable auf dem EDT ausgeführt wird.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Z Java-Swing : JComponent AWT, Swing, JavaFX & SWT 2
B Batik: Inhalt JComponent to SVG? AWT, Swing, JavaFX & SWT 6
Hatsi09 JComponent anklicken und "entklicken" AWT, Swing, JavaFX & SWT 7
L JComponent aus JPanel anhand Mausposition ermitteln AWT, Swing, JavaFX & SWT 10
S Swing Schwierigkeiten mit JComponent AWT, Swing, JavaFX & SWT 4
T Swing JComponent vergrößern AWT, Swing, JavaFX & SWT 4
L JComponent und MouseMotionListener AWT, Swing, JavaFX & SWT 2
M Mouse Click Event ohne ein JComponent Objekt AWT, Swing, JavaFX & SWT 3
L Eigene JComponent in GridLayout AWT, Swing, JavaFX & SWT 9
Z JComponent's requestFocus() - Wieso nicht immer anwendbar? AWT, Swing, JavaFX & SWT 1
W JComponent - ComponentListener - resized / moved AWT, Swing, JavaFX & SWT 5
Developer_X Wie heißt das JComponent hier? AWT, Swing, JavaFX & SWT 2
A Swing Eigene JComponent Scrollable AWT, Swing, JavaFX & SWT 6
R JComponent auf Canvas AWT, Swing, JavaFX & SWT 8
A Abgeleitete JComponent wird nicht gezeichnet AWT, Swing, JavaFX & SWT 10
A JComponent Größe AWT, Swing, JavaFX & SWT 8
T jcomponent wird nicht angezeigt AWT, Swing, JavaFX & SWT 9
S Eigene JComponent Image zeichnen AWT, Swing, JavaFX & SWT 3
H Swing "Drag and Drop" eines JComponent über ein JPanel AWT, Swing, JavaFX & SWT 2
N 2D-Grafik RTF in eigener JComponent AWT, Swing, JavaFX & SWT 2
D Swing JComponent zeichnen ohne sie zur Oberfläche hinzuzufügen AWT, Swing, JavaFX & SWT 2
P JComponent / JLabel drehen (Rotation) AWT, Swing, JavaFX & SWT 2
D JComponent erweitern AWT, Swing, JavaFX & SWT 4
M 2x JComponent in einem JFrame darstellen? AWT, Swing, JavaFX & SWT 7
StupidAttack Animation, JComponent AWT, Swing, JavaFX & SWT 3
P Swing Eigene Komponente Entwickeln - erben von JComponent oder JPanel? AWT, Swing, JavaFX & SWT 5
B Wechsel JTextArea und JComponent AWT, Swing, JavaFX & SWT 9
S Unterscheiden ob ein Graphics-Objekt von einer JComponent oder einem BufferedImage kommt..? AWT, Swing, JavaFX & SWT 4
H JComponent == JTextfield? AWT, Swing, JavaFX & SWT 4
C Ermitteln ob JComponent einen Listener besitzt AWT, Swing, JavaFX & SWT 2
T Eigene JComponent AWT, Swing, JavaFX & SWT 4
G JComponent nachträglich in JPanel einfügen AWT, Swing, JavaFX & SWT 5
M Ganzen Frame mit JComponent ausfüllen AWT, Swing, JavaFX & SWT 9
M JMenu teilweise unter einer JComponent AWT, Swing, JavaFX & SWT 4
I Swing JComponent als BufferedImage speichern AWT, Swing, JavaFX & SWT 18
1 Eigene JComponent mit MouseListener versehen AWT, Swing, JavaFX & SWT 10
T JComponent nur in Swing verwendbar? AWT, Swing, JavaFX & SWT 6
M Mehrere Icons in einer JComponent AWT, Swing, JavaFX & SWT 5
Dragonfire Image von JComponent AWT, Swing, JavaFX & SWT 2
T x und y herrausfinden eines JComponent auf JFrame AWT, Swing, JavaFX & SWT 14
J absolute Position einer JComponent ermitteln AWT, Swing, JavaFX & SWT 4
B "weiches" Bewegen von einem JComponent AWT, Swing, JavaFX & SWT 18
ARadauer JPanel vs JComponent AWT, Swing, JavaFX & SWT 2
I JDialog aus JComponent erstellen AWT, Swing, JavaFX & SWT 2
S JComponent u. JPanel ausdrucken AWT, Swing, JavaFX & SWT 3
J SWT JComponent Problem AWT, Swing, JavaFX & SWT 4
T JComponent überzeichnen? AWT, Swing, JavaFX & SWT 2
G JComponent in JTable AWT, Swing, JavaFX & SWT 8
M JComponent wird in JFrame nicht angezeigt AWT, Swing, JavaFX & SWT 4
D bei Thread in JComponent malen NullPointerException AWT, Swing, JavaFX & SWT 3
S Alle EventListener einer JComponent abfragen? AWT, Swing, JavaFX & SWT 3
S JComponent in JPanel darstellen AWT, Swing, JavaFX & SWT 2
N JComponent#getClientProperty(key) welche Schlüssel gibt es? AWT, Swing, JavaFX & SWT 3
E Drucken von JComponent. AWT, Swing, JavaFX & SWT 4
S JComponent ersetzen AWT, Swing, JavaFX & SWT 13
R Resize Problem bei JComponent AWT, Swing, JavaFX & SWT 2
M JButton in JComponent abfragen AWT, Swing, JavaFX & SWT 6
S Mausbehandlungen für JComponent AWT, Swing, JavaFX & SWT 7
M Verschiebbare JComponent AWT, Swing, JavaFX & SWT 5
C zeichnen auf jComponent AWT, Swing, JavaFX & SWT 3
S in einem JComponent zu zeichnen AWT, Swing, JavaFX & SWT 4
G Grafik auf JComponent ohne Überschreiben von Paint-Methoden AWT, Swing, JavaFX & SWT 4
R JComponent malt seine Kinder nicht AWT, Swing, JavaFX & SWT 8
G JComponent Hintergrund AWT, Swing, JavaFX & SWT 3
M JMenu auf JComponent? AWT, Swing, JavaFX & SWT 10
G Graphics (g) und JComponent prob. AWT, Swing, JavaFX & SWT 2
G Klasse XYComponent extends JComponent AWT, Swing, JavaFX & SWT 3
Juelin Für Java-Spezialisten AWT, Swing, JavaFX & SWT 4
Juelin Java <-> Delphi AWT, Swing, JavaFX & SWT 3
H Exceptions seit java: 1.6.0_65 Umstellung AWT, Swing, JavaFX & SWT 3
H Exception: java.lang.ClassCastException AWT, Swing, JavaFX & SWT 2
M JavaFX java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found AWT, Swing, JavaFX & SWT 5
J Java GUI Dropdown-Menü anzeigen AWT, Swing, JavaFX & SWT 5
M Eigene Java Klasse für allgemeine Grafikelemente AWT, Swing, JavaFX & SWT 8
thor_norsk Java - Allgemeine - Frage AWT, Swing, JavaFX & SWT 14
W Kennt jemand Dear ImGui (und den Java-Wrapper dazu)? AWT, Swing, JavaFX & SWT 0
B Java Projekt mit JavaFX und jfoenix ausführbar machen AWT, Swing, JavaFX & SWT 46
D JAVA Schieberegler AWT, Swing, JavaFX & SWT 6
N JavaFX Einfacher Taschenrechner mit Scene Builder und Java FX AWT, Swing, JavaFX & SWT 0
Jose05 Aus einer normalen Java Klasse eine FXML-Klasse laden AWT, Swing, JavaFX & SWT 12
S Welches Java Layout sollte ich verwenden? AWT, Swing, JavaFX & SWT 3
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
P Fehlermeldung: Error: Could not find or load main class set Caused by: java.lang.ClassNotFoundException: set AWT, Swing, JavaFX & SWT 5
Encera Java FX im Eclipse-Marketplace nichtmehr auffindbar AWT, Swing, JavaFX & SWT 6
_user_q Versionscode aus build.gradle in Java-Klasse ausgeben lassen AWT, Swing, JavaFX & SWT 14
M Java Dateien kopieren mit Fortschrittsbalken AWT, Swing, JavaFX & SWT 13
M Frage zu Java Bundesligaverwaltung AWT, Swing, JavaFX & SWT 7
_user_q Gibt es eine Möglichkeit, in Java alle möglichen Zeichen automatisch tippen zu lassen? AWT, Swing, JavaFX & SWT 13
E 3D-Grafik Java Fatal error bei LWJGL AWT, Swing, JavaFX & SWT 2
Heldderschatten Java Events und Interfaces AWT, Swing, JavaFX & SWT 18
volcanos Scrollen: JScrollPane mit Graphics g und Java-Fonts extends Frame ? AWT, Swing, JavaFX & SWT 5
sserio Java Fx - Problem AWT, Swing, JavaFX & SWT 3
U Warum wird zweimal die Affinetransformation estellt (2Dgraphics, Java)? AWT, Swing, JavaFX & SWT 31
U was bewirkt die methode fill und unterschied zu anderen fill Methoden in 2dgraphics? (Java)? AWT, Swing, JavaFX & SWT 6
DonBronson Java Graphics bewegbar machen (Drag&Drop) AWT, Swing, JavaFX & SWT 3
Yonnig Lokale HTML-Datei in Java GUI rendern AWT, Swing, JavaFX & SWT 4
E Java-TexturePaint sehr langsam AWT, Swing, JavaFX & SWT 9
N Java MySQL Datenbank durchsuchen? AWT, Swing, JavaFX & SWT 7
maximstein JavaFX WebView - java.lang.NoSuchMethodError: 'boolean com.sun.prism.ResourceFactory.isDisposed()' AWT, Swing, JavaFX & SWT 4
Splayfer Custom Font in AttributedString Java AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen


Oben