2009-04-21 11 views
0

hey, j'ai ce code qui devrait enregistrer une java.util.Vector des classes sérialisables personnalisée:fonction Java sauvegarde ne fonctionne pas

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

Mais lors de l'enregistrement, il montre l'une des erreurs de dialogue définies en disant: IOException: Could not save file: null (com.sun.java.swing.plaf.windows.WindowsFileChooserUI) et il y a un NullPointerException dans la ligne de commande à javax.swing.plaf.basic.BasicListUI.convertModelToRow(BasicListUI.java:1251)

Répondre

0

J'ai trouvé l'erreur, le script de dialogue de sauvegarde fonctionnait parfaitement mais la classe dans le vecteur avait un pointeur nul qui causait l'erreur.

Mais merci pour toutes les réponses, je pourrais utiliser certains d'entre eux :)

0

peut-être vous pouvez faire un meilleur contrôle pour le nom du fichier:

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

Je ne sais pas exactement quel est le problème, puisque vos messages d'exception ne sont pas si clairs. Mais j'ai 2 remarques sur votre code:

  1. Un Null-Check du nom du fichier (ou fichier) est correct (comme suggéré par romaintaz)
  2. Pourquoi vous modifiez le fichier à son nom? Conservez l'objet de fichier et transmettez-le au flux.
0

Il y a quelques erreurs dans votre code.

  • Vous définissez le nom de fichier de manière conditionnelle. Si vous ne le définissez pas, vous essayez toujours de l'utiliser.
  • la fermeture d'un ByteArrayOutputStream (ce qui est inutile, voir api)
  • Vous convertir un objet fichier à un nom de fichier, alors que vous pouvez utiliser le objetfichier pour écrire au flux

Je suggère au code cela comme ceci:

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

Votre problème est difficile à diagnostiquer parce que vous n'êtes pas montrer les traces de la pile des exceptions vous attraper.

Et pourquoi voudriez-vous sérialiser quelque chose dans un ByteArrayOutputStream seulement pour écrire le tableau d'octets dans un fichier? Avez-vous besoin de perdre de la mémoire pour une raison quelconque?

+0

Exigences inhabituelles :) – willcodejavaforfood

Questions connexes