2017-04-01 88 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