2017-04-01 216 views
0

这里有趣的小错误,希望有人能指出发生在我身上的事情。将JTable导出到txt文件

如果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"); 
     } 

edit:added ex.printStackTrace();它显示了一个数组索引越界异常

+0

你会知道为什么如果你放弃吃异常并阅读错误信息。为了显示“失败”,您将丢弃它提供的所有信息。你认为'Exception ex'意味着什么?这意味着你正在将一个名为'ex'的变量交给Exception对象,并且该对象包含有关该异常的信息。用它。 –

+0

向异常添加了printStackTrace行,并且它弹出了一个arrayIndexOutofBounds异常4> = 4 – Justiciar

+0

而堆栈跟踪告诉你究竟是哪行代码抛出异常。因此,在该行上设置一个断点,并在调试器中遍历代码,观察变量值,并找出超出数组边界的原因。我们无法为您做到这一点,因为我们没有其他代码或您正在使用的文件进行设置。这不像无效指数是20亿;它是4,这意味着你只需要通过代码4次来达到通过失败。 –

回答

3

所以,在看看这个...

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

我留下想知道什么getRowCount与列数做... pherhaps你的意思是...... 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(); 
} 
+0

辉煌upvoted和答案例外。讨厌这样的景点有多小,会让你长时间刮目相看。感谢您查看它!另外,madprogrammer,你无处不在!赞赏。 – Justiciar

+0

欢迎来到森林,寻找树木;) – MadProgrammer