2009-04-21 6 views
0

эй, у меня есть этот код, который должен спасти java.util.Vector пользовательских сериализуемых классов:Java сохранить функция не работает

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)

ответ

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

Я не знаю точно, в чем проблема, так как ваши сообщения об исключении не так понятны. Но у меня есть 2 замечания по поводу вашего кода:

  1. Нуль-Проверка имени файла (или файлов) будет в порядке (как это было предложено romaintaz)
  2. Почему вы изменить файл к его имени? Сохраните файл-объект и передайте его в поток.
0

В коде есть несколько неправильных вещей.

  • Вы задали имя файла условно. Если вы его не установили, вы все равно пытаетесь его использовать.
  • Вы закрываете ByteArrayOutputStream (что бесполезно, см апи)
  • Вы конвертируете объект файла обратно в имя файла, в то время как вы можете использовать объект файла для записи потока

Я хотел бы предложить, чтобы код это так:

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

Ваша задача трудно диагностировать, потому что вы не показывает трассировку стека исключений вы отлова.

И зачем вам сериализовать что-то в ByteArrayOutputStream только для того, чтобы написать массив байтов в файл? Вам почему-то нужно избавляться от памяти?

+0

Необычное требование :) – willcodejavaforfood