W
Wraithyle
Gast
Hallo an alle Java Programmierer,
da ich nun fast am Verzweifeln bin mit meinem kleinen javaapplet, wende ich mich an euch. Ich hoffe das Thema passt in diese Kategorie.
Zu erst einmal worum es geht: Es handelt sich um ein einfaches Chatsystem mit Server und Client, welche über Socket kommunizieren. Funktioniert soweit auch gut, bis auf ein sporadisch auftretendes Exception, was denke ich aus der fehlenden Threadsicherheit hervorgeht. Da das Applet ziemlich viel Code enthält, versuche ich hier nur vereinfacht einen Auszug zu zeigen. Sollte ein Abschnitt doch detailierter benötigt werden, bitte bescheid geben:
Beim Testen zeigten sich dann allerdings 2 Probleme. Bei beiden wird das unten stehende Exception geworfen. Ein Auslöser ist, wenn viele Nachrichten geschickt werden und dadurch oft die MessageBox mit neuem setText(...) aktualisiert wird. Der andere Auslöser ist, wenn ich im Browser das Applet schließe und kurz danach wieder neu öffne.
Nun habe ich in der JavaAPI gesucht und bin auf SwingUtilities.invokeLater() gestoßen. Probeweise habe ich damit versuch die run() methode damit zu ersetzen. Allerdings lässt sich damit nur das erstere Problem beheben. Ein Seitenwechsel im Browser und wieder zurück zum Applet brachte wieder das Exception.
Meine Frage ist daher, wie kann ich das Applet nun komplett Threadsicher machen? Vielleicht ist der Aufbau nicht so gut geeignet und das Applet als Thread starten keine gute Lösung. Falls ja, was wäre eine bessere Lösung?
Zum Exception:
Exception in thread "AWT-EventQueue-3" java.lang.NullPointerException
at javax.swing.text.html.parser.Parser.errorContext(Unknown Source)
at javax.swing.text.html.parser.Parser.parse(Unknown Source)
at javax.swing.text.html.parser.DocumentParser.parse(Unknown Source)
at javax.swing.text.html.parser.ParserDelegator.parse(Unknown Source)
at javax.swing.text.html.HTMLEditorKit.read(Unknown Source)
at javax.swing.JEditorPane.setText(Unknown Source)
at de.domain.client.applet.Chat$12.run(Chat.java:506)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(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)
da ich nun fast am Verzweifeln bin mit meinem kleinen javaapplet, wende ich mich an euch. Ich hoffe das Thema passt in diese Kategorie.
Zu erst einmal worum es geht: Es handelt sich um ein einfaches Chatsystem mit Server und Client, welche über Socket kommunizieren. Funktioniert soweit auch gut, bis auf ein sporadisch auftretendes Exception, was denke ich aus der fehlenden Threadsicherheit hervorgeht. Da das Applet ziemlich viel Code enthält, versuche ich hier nur vereinfacht einen Auszug zu zeigen. Sollte ein Abschnitt doch detailierter benötigt werden, bitte bescheid geben:
Java:
public class Chat extends JApplet implements Runnable {
public void init() {
createGUI(); // hier wird die GUI erstellt
}
public void start() {
connect(); // verbindungsaufbau
new Thread(this).start(); // startet den Thread für den Nachrichtenempfang
}
...
// Hier wird auf Nachrichten gewartet (Endlosschleife)
public void run() {
while(true) {
...
// nachricht empfangen und in die messageBox schreiben
Chat.this.messageBox.setText(...); // <- Hier wird im Exception der NullPointer gemeldet
// MessageBox ist vom Typ: JTextPane
}
}
Nun habe ich in der JavaAPI gesucht und bin auf SwingUtilities.invokeLater() gestoßen. Probeweise habe ich damit versuch die run() methode damit zu ersetzen. Allerdings lässt sich damit nur das erstere Problem beheben. Ein Seitenwechsel im Browser und wieder zurück zum Applet brachte wieder das Exception.
Meine Frage ist daher, wie kann ich das Applet nun komplett Threadsicher machen? Vielleicht ist der Aufbau nicht so gut geeignet und das Applet als Thread starten keine gute Lösung. Falls ja, was wäre eine bessere Lösung?
Zum Exception:
Exception in thread "AWT-EventQueue-3" java.lang.NullPointerException
at javax.swing.text.html.parser.Parser.errorContext(Unknown Source)
at javax.swing.text.html.parser.Parser.parse(Unknown Source)
at javax.swing.text.html.parser.DocumentParser.parse(Unknown Source)
at javax.swing.text.html.parser.ParserDelegator.parse(Unknown Source)
at javax.swing.text.html.HTMLEditorKit.read(Unknown Source)
at javax.swing.JEditorPane.setText(Unknown Source)
at de.domain.client.applet.Chat$12.run(Chat.java:506)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(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)