【问题标题】:Exporting JTable to txt file将 JTable 导出为 txt 文件
【发布时间】:2017-04-01 00:16:06
【问题描述】:

这里有一个有趣的小错误,希望有人能指出我发生了什么。

如果 JTable 中有大约 4 个或更少的条目,我的程序能够写入文本文件。一旦不止于此,它就会失败并抛出一个弹出我的 catch 块的异常。不知道发生了什么。

public void actionPerformed(ActionEvent e)
    {
        try
        {
            BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("payrollData.txt"));
            PrintWriter fileWriter = new PrintWriter(bufferedWriter);

            for(int i = 0; i < outputTable.getRowCount()+1; i++)
            {     
                String headers = String.valueOf(outputTable.getColumnName(i));
                fileWriter.print(headers);
                fileWriter.print("\t");
            }   

            fileWriter.println("");
            for(int i=0; i<model.getRowCount(); ++i)
            {
                for(int j=0; j<model.getColumnCount(); ++j)
                {
                    String s = model.getValueAt(i,j).toString();
                    fileWriter.print(s);
                    fileWriter.print("\t\t");
                }
                fileWriter.println("");
            }      
            fileWriter.close();
            JOptionPane.showMessageDialog(null, "Success. File saved to payrollData.txt");
        }catch(Exception ex)
        {
            JOptionPane.showMessageDialog(null, "Failure");
        }

编辑:添加 ex.printStackTrace();它显示了一个数组索引越界异常

【问题讨论】:

  • 如果您停止吃异常并阅读错误消息,您就会知道为什么。您正在丢弃它会为您提供的所有信息,以便仅显示“失败”。你认为Exception ex 到底是什么意思?这意味着您将收到名为ex 的变量中的异常对象,并且该对象包含有关异常的信息。使用它。
  • 向异常添加了 printStackTrace 行,它弹出了一个 arrayIndexOutofBounds 异常 4>=4
  • 堆栈跟踪会准确地告诉您是哪一行代码引发了异常。因此,在该行设置断点并在调试器中单步执行您的代码,观察变量值,并找出您超出数组边界的原因。我们不能为您这样做,因为我们没有您的其余代码或您正在使用的文件来进行设置。不像无效索引是20亿;它是 4,这意味着您只需在代码失败时单步执行 4 次即可通过。
  • 我实际上没有调试器。你会推荐一个吗?
  • 我猜是i &lt; outputTable.getRowCount()+1,特别是+ 1,因为大多数数组和列表都是从零开始的(意味着有效索引是从0到1)和@987654326 @ 超出限制。删除+ 1 看看是否一切正常。

标签: java swing file-io jtable


【解决方案1】:

那么,看看这个...

for(int i = 0; i < outputTable.getRowCount()+1; i++)
{     
    String headers = String.valueOf(outputTable.getColumnName(i));
    fileWriter.print(headers);
    fileWriter.print("\t");
} 

我想知道getRowCount 与列数有什么关系......也许你的意思是getColumnCount......这意味着你也可以摆脱+1

观察...

花了一些时间运行代码后,我可以做一些其他的小观察。

首先,我强烈建议您使用The try-with-resources Statement,这样可以让您更好地管理您的资源。

我还建议使用StringJoiner 来生成每一行,这比尝试检查你是否写出最后一列更简单,并允许你提供你想要使用的任何分隔符

举个例子……

DefaultTableModel model = new DefaultTableModel();
model.addColumn("Purpose");
model.addColumn("Name");
model.addColumn("Composition");
model.addColumn("Expiry");
model.addColumn("Stock");
model.addColumn("Cost");
model.addColumn("Type");
model.addColumn("Supplier");
model.addColumn("Supplier Number");
model.addColumn("Rack");

for (int index = 0; index < 10; index++) {

    Vector vector = new Vector();
    vector.add("p" + index);
    vector.add("n" + index);
    vector.add("c" + index);
    vector.add("e" + index);
    vector.add("s" + index);
    vector.add("c" + index);
    vector.add("t" + index);
    vector.add("s" + index);
    vector.add("s" + index);
    vector.add("r" + index);

    model.addRow(vector);

}

JTable table = new JTable(model);

try (BufferedWriter bw = new BufferedWriter(new FileWriter(new File("Test.txt")))) {
    StringJoiner joiner = new StringJoiner(",");
    for (int col = 0; col < table.getColumnCount(); col++) {
        joiner.add(table.getColumnName(col));
    }
    System.out.println(joiner.toString());
    bw.write(joiner.toString());
    bw.newLine();
    for (int row = 0; row < table.getRowCount(); row++) {
        joiner = new StringJoiner(",");
        for (int col = 0; col < table.getColumnCount(); col++) {
            Object obj = table.getValueAt(row, col);
            String value = obj == null ? "null" : obj.toString();
            joiner.add(value);
        }
        System.out.println(joiner.toString());
        bw.write(joiner.toString());
        bw.newLine();
    }
} catch (IOException exp) {
    exp.printStackTrace();
}

【讨论】:

  • Brilliant upvoted 和答案除外。讨厌这样的小景点让你长时间摸不着头脑。感谢您查看!还有,疯狂的程序员,你无处不在!赞赏。
  • 欢迎来到森林,注意树木;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 2021-12-23
  • 1970-01-01
  • 2022-01-20
相关资源
最近更新 更多