2014-10-17 53 views
1

此代碼是按鈕的操作偵聽器。我有一個用戶輸入數據的JTable。它充滿了整數。出於某種原因,我能夠println()中的每一個值。但是,由於NullPointerException,我無法將它們存儲到我的ArrayList中。由於NullPointer Execption無法從JTable獲取數據

btnCalculate.addActionListener(new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent arg0) { 

     ArrayList<Integer> blades=new ArrayList<Integer>(); 

     DefaultTableModel dtm = (DefaultTableModel) tableBlades.getModel(); 
     int nRow = dtm.getRowCount(), nCol = dtm.getColumnCount(); 
     System.out.println(nRow + ", " + nCol); 
     for (int i = 0 ; i < nRow ; i++) { 
      for (int j = 0 ; j < nCol ; j++) { 
       blades.add(Integer.parseInt(dtm.getValueAt(i,j).toString())); 
      } 
     } 
    } 
}); 

:基於錯誤日誌(編輯爲便於閱讀,添加括號)

,我已經能夠將它縮小到了我的價值添加到ArrayList行。我知道getValueAt()返回一個對象,所以我使用toString()和parseInt()使它成爲一個整數。任何想法這裏發生了什麼,以及如何解決它?

+1

您可以檢查dtm是否爲空,或者如果dtm.getValueAt(i,j)返回null。 – PeterK 2014-10-17 15:36:19

+2

我確定'getValueAt(i,j)'將爲空 – 2014-10-17 15:37:24

+0

@PeterK'dtm'不能爲null,否則'nRow'會拋出一個NPE,否則,這很可能是。 – Obicere 2014-10-17 15:38:00

回答

1

你知道如何使用調試器?如果沒有,你應該學習如何並逐步完成代碼,看看發生了什麼。

dtm.getValue(i,j)對於ij的某些組合返回null。使用調試器,您可以確切確定它發生的位置。

如果這種預期(這可能是null),那麼你應該防守編程,並輸入一個空檢查,是這樣的:

Integer cellValue = dtm.getValueAt(i,j); 
if (cellValue != null) { 
    blades.add(cellValue); 
} 

當然,如果這也不行的單元格的值是null,或錯過blades的值,那麼您應該將其作爲錯誤處理,例如向用戶報告數據丟失等。

+0

謝謝!我看着使用調試器,結果是最後一個單元格留空。剩下的價值被保存得很好。我將添加代碼來防止空值。 – user3536446 2014-10-17 16:43:07