G
Gast
Gast
Hallo,
In meiner Anwendung kann der Benutzer ein Struktogramm und den dzugehoerigen Algorithmus erstellen. Das Struktogramm kann in meinem eigenen Format gespeichert werden (simple Serializierung einer Linkedlist). Das funktioniert auch. Aber jetzt kommt mein Problem: Der Algorithmus kann zur Laufzeit ausgefuehrt werden, danach ist das Speichern aber nicht mehr moeglich, dann kommt folgende Fehlermeldung:
Java.io.NotSerializablException: java.io.PrintWriter
Leider erhalte ich keine Quelle, wo der Fehler auftaucht (halt innerhalb der Speichermethode).
Kann mir jemand helfen, heraus zu finden, woran der Bug liegt?
Danke an jeden, der sich durch den Quellcode arbeitet.
Hier zunaechst der Quellcode fuer das Speichern:
Hier der Quellcode vom Ausfuehren:
In meiner Anwendung kann der Benutzer ein Struktogramm und den dzugehoerigen Algorithmus erstellen. Das Struktogramm kann in meinem eigenen Format gespeichert werden (simple Serializierung einer Linkedlist). Das funktioniert auch. Aber jetzt kommt mein Problem: Der Algorithmus kann zur Laufzeit ausgefuehrt werden, danach ist das Speichern aber nicht mehr moeglich, dann kommt folgende Fehlermeldung:
Java.io.NotSerializablException: java.io.PrintWriter
Leider erhalte ich keine Quelle, wo der Fehler auftaucht (halt innerhalb der Speichermethode).
Kann mir jemand helfen, heraus zu finden, woran der Bug liegt?
Danke an jeden, der sich durch den Quellcode arbeitet.
Hier zunaechst der Quellcode fuer das Speichern:
Code:
//Speichern der LinkedList, wenn noch kein Name eingeben, dann speichern unter aufrufen
public boolean structDateiSpeichern()
{
if(aktDateiname==null)
{
return structDateiSpeichernUnter();
}
try
{
//Datei erstellent
File datei = new File(aktDateiname);
aktDateiname = datei.getName();
StructX.getAktivFenster().getStruktogramm().setName(aktDateiname);
String pfad=datei.getPath();
//Liste zum Speichern erstellen
LinkedList outList=new LinkedList();
//für Übernahme Algorithmus und Standardeinstellung vermerken
StructX.getAktivFenster().getStruktogramm().getRootObject().setAlgorithmus(StructX.getAktivFenster().getAlgorithmus());
StructX.getAktivFenster().getStruktogramm().getRootObject().setStdRoot(StructX.getAktivFenster().getStruktogramm().getSetStd());
//als erstes RootObject in Speicherliste einfügen
outList.add(StructX.getAktivFenster().getStruktogramm().getRootObject());
//Struktogramm in Speicherliste einfügen
StructX.getAktivFenster().getStruktogramm().getRootObject().addSpeicherList(outList);
ObjectOutputStream os=new ObjectOutputStream(new FileOutputStream(datei));
os.writeObject(outList);
os.close();
//auf keine Änderungen setzen
this.setGeaendert(false);
StructX.getAktivFenster().setTitle("Struktogramm Nr."+Fenster.getOpenFrameCount() +" : "+this.getName());
StructX.getAktivFenster().revalidate();
this.setGespeichert(true);
}
catch (IOException e)
{
System.out.println("Fehler beim Speichern!");
System.out.println(e.getMessage());
System.out.println(e.toString());
System.out.println(e.getCause());
}
return false;
}
Hier der Quellcode vom Ausfuehren:
Code:
//Run Methode überschreiben
public void run()
{
//Solange Thread nicht abgebrochen wurde:
if(this.isInterrupted()==false)
{
//ArgumentenString für Main-Methode anlegen
//und Main Methode kompilieren starten
String[] args =new String[]{"-d",System.getProperty("user.dir"),filename};
int status =Main.compile(args);
switch(status)
{
//beim Kompilieren der MainMethode:
case 0:
//neue Klasse anlegen, mit Namen der JavaDatei
File classFile=new File(file.getParentFile().getAbsolutePath(),classname + ".class");
//Nach Gebrauch die temp. Datei wieder löschen
classFile.deleteOnExit();
try
{
//Pfad zur Klasse anlegen
URL url=new File(classFile.getParentFile().getAbsolutePath()).toURL();
//Klasse laden
URLClassLoader l = new URLClassLoader(new URL[] { url });
Class clazz = l.loadClass(classname);
//Main Methode mit geladener Klasse ausführen
Method main = clazz.getMethod("main", new Class[] { String[].class });
main.invoke(null, new Object[] {new String[0]});
}catch(InvocationTargetException ex)
{
System.out.println("Fehler beim Ausfuehren!");
}catch(Exception ex)
{
System.out.println("Fehler beim Ausfuehren!");
}
classFile.delete();
break;
case 1: System.out.println("Compile status: ERROR");break;
case 2: System.out.println("Compile status: CMDERR");break;
case 3: System.out.println("Compile status: SYSERR");break;
case 4: System.out.println("Compile status: ABNORMAL");break;
default: System.out.println("Compile status: Unknown exit status");
}
}