0

嘿,我有这段代码应该保存一个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)

4

5 回答 5

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 {
 ...
 }
于 2009-04-21T07:42:05.480 回答
0

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

  1. 文件名(或文件)的 Null-Check 是可以的(如romaintaz所建议的)
  2. 为什么将文件更改为其文件名?保留文件对象并将其传递给流。
于 2009-04-21T07:49:16.290 回答
0

您的代码中有一些错误。

  • 您有条件地设置文件名。如果你不设置它,你仍然尝试使用它。
  • 你关闭一个 ByteArrayOutputStream (这是没用的,见 api)
  • 您将文件对象转换回文件名,同时可以使用文件对象写入流

我建议这样编码:

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);
}
于 2009-04-21T08:22:47.177 回答
0

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

为什么要将某些内容序列化为ByteArrayOutputStream仅将字节数组写入文件?您是否出于某种原因需要浪费内存?

于 2009-04-21T08:32:24.360 回答
0

我发现了错误,保存对话框脚本本身运行良好,但向量中的类有一个导致错误的空指针。

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

于 2009-04-21T15:53:59.683 回答