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

しかし、保存すると、次のように定義されたダイアログ エラーの 1 つが表示さ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. ファイルをそのファイル名に変更するのはなぜですか? File-Object を保持し、ストリームに渡します。
于 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 に答える