2009-04-21 9 views
0
funktioniert

hey, ich habe diesen Code, der eine java.util.Vector von benutzerdefinierten serializable Klassen speichern soll:Java speichern Funktion nicht

if(filename.equals("")){ 
    javax.swing.JFileChooser fc = new javax.swing.JFileChooser(); 
    if(fc.showSaveDialog(this) == javax.swing.JFileChooser.APPROVE_OPTION){ 
     filename = fc.getSelectedFile().toString(); 
    } 
} 
try{ 
    java.io.FileOutputStream fos = new java.io.FileOutputStream(filename); 
    java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream(); 
    java.io.ObjectOutputStream oos = new java.io.ObjectOutputStream(baos); 
    oos.writeObject((Object)tl.entities); 
    baos.writeTo(fos); 
    oos.close(); 
    fos.close(); 
    baos.close(); 
}catch(java.io.FileNotFoundException e){ 
    javax.swing.JOptionPane.showMessageDialog(this, "FileNotFoundException: Could not save file: "+e.getCause()+" ("+e.getMessage()+")", "Error", javax.swing.JOptionPane.ERROR_MESSAGE); 
}catch(java.io.IOException e){ 
    javax.swing.JOptionPane.showMessageDialog(this, "IOException: Could not save file: "+e.getCause()+" ("+e.getMessage()+")", "Error", javax.swing.JOptionPane.ERROR_MESSAGE); 
} 

Aber beim Speichern, es zeigt eine der definierten Dialog Fehler zu sagen: IOException: Could not save file: null (com.sun.java.swing.plaf.windows.WindowsFileChooserUI) und es gibt ein NullPointerException in der Befehlszeile an javax.swing.plaf.basic.BasicListUI.convertModelToRow(BasicListUI.java:1251)

Antwort

0

fand ich den Fehler, der Dialog Skript selbst perfekt funktioniert speichern aber die Klasse in den Vektor hatte einen Null-Zeiger, der den Fehler verursacht hat.

Aber danke für alle Antworten, ich könnte einige von ihnen verwenden :)

0

vielleicht können Sie eine bessere Kontrolle für die Dateinamen tun:

if (filename == null || "".equals(filename)){ 
    javax.swing.JFileChooser fc = new javax.swing.JFileChooser(); 
    if(fc.showSaveDialog(this) == javax.swing.JFileChooser.APPROVE_OPTION){ 
     filename = fc.getSelectedFile().toString(); 
    } 
    if (filename == null || "".equals(filename)) { 
     // Display a message or anything else 
     return; 
    } 
} 
try { 
... 
} 
0

Ich weiß nicht genau, was das Problem ist, da Ihre Exception-Nachrichten nicht so klar sind. Aber ich habe 2 Bemerkungen über Ihren Code:

  1. Ein Null-Check des Dateinamens (oder Datei) würde in Ordnung sein (wie von romaintaz vorgeschlagen)
  2. warum Sie die Datei auf den Dateinamen ändern sich? Bewahren Sie das File-Objekt auf und übergeben Sie es an den Stream.
0

Es gibt ein paar Dinge falsch in Ihrem Code.

  • Sie legen den Dateinamen bedingt fest. Wenn Sie es nicht festlegen, versuchen Sie immer noch, es zu verwenden.
  • Sie schließen eine ByteArrayOutputStream (was nutzlos ist, siehe api)
  • Sie konvertieren ein Dateiobjekt auf einen Dateinamen zurück, während Sie das Fileobject für das Schreiben in den Stream

verwenden kann ich Code würde vorschlagen dies wie folgt aus:

while(file == null) { // force a file to be choosen 
    javax.swing.JFileChooser fc = new javax.swing.JFileChooser(); 
    if(fc.showSaveDialog(this) == javax.swing.JFileChooser.APPROVE_OPTION) { 
      file = fc.getSelectedFile() 
    } 
    else { 
     javax.swing.JOptionPane.showMessageDialog(this, "No file selected", "Error", javax.swing.JOptionPane.ERROR_MESSAGE); 
    } 
} 

try{ 
     java.io.FileOutputStream fos = new java.io.FileOutputStream(file); 
     java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream(); 
     java.io.ObjectOutputStream oos = new java.io.ObjectOutputStream(baos); 

     oos.writeObject((Object)tl.entities); 
     baos.writeTo(fos); 
     oos.close(); 
     fos.close(); 

}catch(java.io.FileNotFoundException e){ 
     javax.swing.JOptionPane.showMessageDialog(this, "FileNotFoundException: Could not save file: "+e.getCause()+" ("+e.getMessage()+")", "Error", javax.swing.JOptionPane.ERROR_MESSAGE); 
}catch(java.io.IOException e){ 
     javax.swing.JOptionPane.showMessageDialog(this, "IOException: Could not save file: "+e.getCause()+" ("+e.getMessage()+")", "Error", javax.swing.JOptionPane.ERROR_MESSAGE); 
} 
0

Ihr Problem ist schwer zu diagnostizieren, weil Sie nicht die Stack-Traces der Ausnahmen zeigen Sie kontrollieren.

Und warum sollte man etwas in eine ByteArrayOutputStream serialisiert nur das Byte-Array in eine Datei zu schreiben? Müssen Sie aus irgendeinem Grund Speicher verschwenden?

+0

Ungewöhnliche Anforderung :) – willcodejavaforfood