如何通过 JFileChooser 将 JTable 保存到文本文件

how to save a JTable to text file through JFileChooser

每当我尝试保存文件时,我都会得到

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at java.io.Writer.write(Unknown Source) at reu.FileMod.saveFile(FileMod.java:47)

到目前为止我的代码

    package reu;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import javax.swing.JFileChooser;
import javax.swing.JOptionPane;

import userInterface.TabOne;

public interface FileMod {

    public static void saveFile() {

        File file= null;

        JFileChooser fileChooser = new JFileChooser();
        fileChooser.setDialogTitle("Specify a file to save");

        int userSelection = fileChooser.showSaveDialog(null);

        if (userSelection == JFileChooser.APPROVE_OPTION) {
             file = fileChooser.getSelectedFile();

        }

        BufferedWriter bfw;
        try {

            if(!file.exists()){

                file.createNewFile();
            }

            bfw = new BufferedWriter(new FileWriter(file));

            for (int i = 0; i < TabOne.table.getColumnCount(); i++) {
                bfw.write(TabOne.table.getColumnName(i));
                bfw.write("\t");
            }

            for (int i = 0; i < TabOne.table.getRowCount(); i++) {
                bfw.newLine();
                for (int j = 0; j < TabOne.table.getColumnCount(); j++) {
                    bfw.write((String) (TabOne.table.getValueAt(i, j)));
                    bfw.write("\t");
                    ;
                }
            }
            bfw.close();
            JOptionPane.showMessageDialog(null, "Successful!");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

文件已创建但为空。

bfw.write(TabOne.table.getColumnName(i)); bfw.write((String) (TabOne.table.getValueAt(i, j)));

要么 getColumnName(i) 返回 null,要么 getValueAt(i,j) 返回 null。如果您写入空值,Writer 将抛出 NullPointerException。

在这两种情况下,您都应该保存到一个变量中,测试是否为空,如果是则用“”替换,例如

String val = (String) TabOne.table.getValueAt(i, j);
if (val == null) {
  val = "";
}
btw.write(val);