Java保存功能不起作用

时间:2009-04-21 07:37:31

标签: java dialog save ioexception

嘿,我有这个代码应该保存java.util.Vector自定义可序列化类:

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);
}

但是在保存时,它会显示一个定义的对话框错误:IOException: Could not save file: null (com.sun.java.swing.plaf.windows.WindowsFileChooserUI)并且NullPointerException

的命令行中有一个javax.swing.plaf.basic.BasicListUI.convertModelToRow(BasicListUI.java:1251)

5 个答案:

答案 0 :(得分:0)

也许你可以更好地检查文件名:

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 {
 ...
 }

答案 1 :(得分:0)

我不确切地知道问题是什么,因为您的异常消息不是那么清楚。但我对你的代码有2条评论:

  1. Null-检查文件名(或文件)是否正常(由romaintaz建议)
  2. 为什么要将文件更改为文件名?保留File-Object并将其传递给流。

答案 2 :(得分:0)

您的代码中存在一些问题。

  • 您可以有条件地设置文件名。如果你没有设置它,你仍然会尝试使用它。
  • 你关闭一个ByteArrayOutputStream(没用,请参阅api)
  • 您将文件对象转换回文件名,而您可以使用fileobject写入流

我建议像这样编码:

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);
}

答案 3 :(得分:0)

您的问题很难诊断,因为您没有显示您正在捕获的异常的堆栈跟踪。

为什么要将某些内容序列化为ByteArrayOutputStream只将字节数组写入文件?你出于某种原因需要浪费记忆吗?

答案 4 :(得分:0)

我发现错误,保存对话框脚本本身工作得很好但是向量中的类有一个空指针导致错误。

但是感谢所有回复,我可以使用其中一些:)