Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

programm funktioniert meistens - aber nicht immer...

5 views
Skip to first unread message

Peter

unread,
May 5, 2004, 9:22:05 PM5/5/04
to
das folgende programm funktioniert etwa 5 mal, dann auf einmal erscheinen
unten aufgeführte fehlermeldungen, dann funktionierts vielleicht wieder 10
mal, dann kommen wieder ganz viele laufzeitfehlermeldungen, dann gehts
wieder...

ich vermute, der fehler ist wegen der for-schlaufe bzw. dem
setSelectionStart. der wiederholte aufruf macht zwar keinen sinn, aber ich
lass ab und zu ein search/replace über die jtextpane laufen, wo obiges
problem auch auftritt.

wieso tauchen die fehler auf? wie kann ichs verhindern?

danke im voraus...


import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.io.FileOutputStream;
import java.util.Properties;
import com.sun.j3d.utils.applet.MainFrame;
import java.lang.String;
import java.lang.StringBuffer;
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.text.rtf.*;
import javax.swing.text.StyledDocument;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.JTextPane;

public class se extends JApplet {
protected StyleContext m_context;
protected DefaultStyledDocument m_doc;
protected RTFEditorKit m_kit;

public se() {
JTextPane m_monitor = new JTextPane();
RTFEditorKit m_kit = new RTFEditorKit();
m_monitor.setEditorKit(m_kit);
m_context = new StyleContext();
m_doc = new DefaultStyledDocument(m_context);
m_monitor.setDocument(m_doc);
getContentPane().add(m_monitor, BorderLayout.CENTER);
File fChoosen = new
File("c://j2sdk1.4.2_03//Eigenes//Universe//trigokap10.rtf");
try {
InputStream in = new FileInputStream(fChoosen);
m_doc = new DefaultStyledDocument(m_context);
m_kit.read(in, m_doc, 0);
m_monitor.setDocument(m_doc);
in.close();
}
catch (Exception ex) { }
for(int w=0;w<9999000;w++) if (w % 10==0)
m_monitor.setSelectionStart(5700);
}

public static void main(String[] args) {
MainFrame a=new MainFrame(new se(),100,100);
}
}

java.lang.NullPointerException
at javax.swing.text.FlowView.changedUpdate(FlowView.java:264)
at
javax.swing.text.ParagraphView.changedUpdate(ParagraphView.java:680)
at javax.swing.text.View.forwardUpdateToView(View.java:1221)
at javax.swing.text.View.forwardUpdate(View.java:1192)
at javax.swing.text.BoxView.forwardUpdate(BoxView.java:222)
at javax.swing.text.View.changedUpdate(View.java:798)
at
javax.swing.plaf.basic.BasicTextUI$RootView.changedUpdate(BasicTextUI.java:1
515)
at
javax.swing.plaf.basic.BasicTextUI$UpdateHandler.changedUpdate(BasicTextUI.j
ava:1756)
at
javax.swing.text.AbstractDocument.fireChangedUpdate(AbstractDocument.java:21
3)
at
javax.swing.text.DefaultStyledDocument$ChangeUpdateRunnable.run(DefaultStyle
dDocument.java:2477)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:178)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:454)
at
java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.ja
va:201)
at
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java
:151)
at
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
at
java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)


Patrick Roemer

unread,
May 5, 2004, 9:16:21 PM5/5/04
to
Peter wrote:

> catch (Exception ex) { }
> for(int w=0;w<9999000;w++) if (w % 10==0)
> m_monitor.setSelectionStart(5700);
> }

Kannst Du mal erklaeren, was dieser Code bezwecken soll?

Viele Gruesse,
Patrick

Magnus Benjes

unread,
May 6, 2004, 2:16:37 AM5/6/04
to
"Peter" <p.tr...@hispeed.ch> wrote in message news:<c7c0fn$2op$1...@newshispeed.ch>...

> das folgende programm funktioniert etwa 5 mal, dann auf einmal erscheinen
> unten aufgeführte fehlermeldungen, dann funktionierts vielleicht wieder 10
> mal, dann kommen wieder ganz viele laufzeitfehlermeldungen, dann gehts
> wieder...
Das Programm ist also nicht deterministisch instabil, da ist Threading
Problem ein heißer Tip.

> ich vermute, der fehler ist wegen der for-schlaufe bzw. dem
> setSelectionStart. der wiederholte aufruf macht zwar keinen sinn, aber ich
> lass ab und zu ein search/replace über die jtextpane laufen, wo obiges
> problem auch auftritt.
>
> wieso tauchen die fehler auf? wie kann ichs verhindern?

> java.lang.NullPointerException


> at javax.swing.text.FlowView.changedUpdate(FlowView.java:264)
> at
> javax.swing.text.ParagraphView.changedUpdate(ParagraphView.java:680)
> at javax.swing.text.View.forwardUpdateToView(View.java:1221)
> at javax.swing.text.View.forwardUpdate(View.java:1192)

Hier sagt Dir ja Java schon freundlicherweise wo das Problem liegt.
Hast Du mal bei FlowView in der Zeile 264 nachgeschaut?
So sieht die Zeile aus:
layoutPool.changedUpdate(changes, a, f);

layoutPool ist eine Membervariable die NICHT im Konstruktor
initialisiert wird, sondern erst später. Ab und zu erwischst Du die
Klasse bevor sie sich im Bad fertig gemacht und gefrühstückt hat und
dann bekommst Du eine gewatscht. D.h. Du greifst auf layoutPool zu
bevor es initialisiert ist.

Mein Tip:
Swing ist eher gemächlich, lass Swing seine Zeit die es braucht, mit
so einer hektischen Schleife mag es nicht bombardiert werden.
Bei VB hätte man in jeden Schleifendurchlauf ein DOEVENTS eingebaut.
Bei Swing macht man das mit SwingUtilities.invokeLater() oder
SwingUtilities.invokeAndWait()

Probier mal die beiden Alternativen in Deinem Code aus (innerhalb
Deiner sehr persönlich gestallteten for-Schleife),
Entweder:
SwingUtilities.invokeLater(
new Runnable(){
public void run(){
m_monitor.setSelectionStart(5700);
}
});
Oder:
SwingUtilities.invokeAndWait(
new Runnable(){
public void run(){
m_monitor.setSelectionStart(5700);
}
});

Mit fröhlichen Grüßen
Magnus Benjes

Peter Wieser

unread,
May 10, 2004, 8:54:45 PM5/10/04
to
der fehler taucht immer noch auf - bei beiden varianten. der fehler tritt
sogar auf, wenn ich anstatt einer schlaufe nur einen aufruf mit m_monitor
mach.

Peter Wieser

unread,
May 11, 2004, 12:03:26 PM5/11/04
to

> Kannst Du mal erklaeren, was dieser Code bezwecken soll?
>
macht nichts schlaues ich weiss - es geht nur darum zu zeigen, dass zugriffe
auf m_monitor nicht funktionieren. eigentlich will ich so eine art konverter
für rtf-files bauen; er liest die files ein, verändert sie und speichert sie
wieder ab. unter anderem wird auch text eingefügt, der dieselben
formatierungen haben soll, wie das zeichen, wo er eingefügt wird.


0 new messages