문제

이봐, 나는이 코드를 저장해야 할 코드가있다 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

오류를 발견했습니다. 저장 대화 스크립트 자체가 완벽하게 작동했지만 벡터의 클래스에는 널 포인터가있어 오류가 발생했습니다.

그러나 모든 답장에 감사드립니다. 나는 그들 중 일부를 사용할 수 있습니다 :)

다른 팁

아마도 당신은 파일 이름을 더 잘 확인할 수 있습니다 :

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. 파일 이름 (또는 파일)의 널 확인은 괜찮습니다 (제안대로 Romaintaz)
  2. 파일을 파일 이름으로 변경하는 이유는 무엇입니까? 파일 객체를 유지하고 스트림으로 전달하십시오.

코드에는 몇 가지 문제가 있습니다.

  • 파일 이름을 조건부로 설정했습니다. 설정하지 않으면 여전히 사용하려고합니다.
  • 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);
}

당신이 잡는 예외의 스택 흔적을 보여주지 않기 때문에 문제는 진단하기가 어렵습니다.

그리고 왜 당신은 무언가를 연속화 할 것입니다 ByteArrayOutputStream 바이트 배열을 파일에만 쓰는 것만? 어떤 이유로 메모리를 낭비해야합니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top