我想將字符串分配給2D對象列表,但是每遇到一次NullPointerException。 2D對象列表是將自定義表模型類提供給JTable的數據源。 Source是僅包含數據對的2D字符串列表,但是這兩個部分都是需要打印的字符串,因此Map不適合。 我遍歷源列表並設置表數據列表的值。NullPointerException將值分配給2D對象列表
public class CustomTableModel extends AbstractTableModel {
private List<List<Object>> tableData = new ArrayList<>();
public void setValues(List<List<String>> values) {
//Sanity Check
if (values == null) {
throw new IllegalArgumentException("Values cannot be null");
} else {
System.out.println("Got values in table model");
//Iterate through and set table data
int i = 0;
int j = 0;
for (List<String> l : values) {
for (String s : l) {
setValueAt(s, i, j);
j++;
}
i++;
//Reset to 0 as only 2 colums needed
j = 0;
}
}
}
再往下是setValueAt方法
@Override
public void setValueAt(Object value, int rowIndex, int columnIndex) {
System.out.println("Setting" + value + " at " + rowIndex + "," + columnIndex);
//This gives a NullPointerException
tableData.get(rowIndex).set(columnIndex, value);
//
fireTableCellUpdated(rowIndex, columnIndex);
}
調試器顯示,在
tableData.get(rowIndex).set(columnIndex, value);
所有值都存在並且非空。
我確定一個字符串是一個對象,但是這裏是什麼?
編輯:
我已聲明並初始化爲一個ArrayList代替:
private ArrayList<ArrayList<Object>> tableData = new ArrayList<ArrayList<Object>>();
和更新的setValueAt到:
@Override
public void setValueAt(Object value, int rowIndex, int columnIndex) {
System.out.println("Setting" + value + " at " + rowIndex + "," + columnIndex);
//This causes IndexOutOfBoundsException
if(tableData.get(rowIndex) == null){
tableData.add(rowIndex, new ArrayList<>());
}else{
tableData.get(rowIndex).add(columnIndex, value);
//Called after both columns in a row are populated
fireTableCellUpdated(rowIndex, columnIndex);
}
}
然而,它調用get(當給IndexOutOfBoundsException異常)在if條件中的tableData上。如果它是空的,它應該執行if語句的第一個塊?
,我們指望秒,直到@BobMalooga關閉這個問題進行重複的,因爲「那麼,你應該知道,從每NPE火災同源「。 (http://stackoverflow.com/questions/37022248/nullpointerexception-when-trying-to-pass-data-to-a-fragment?noredirect=1#comment61598934_37022248) –
分解它,使其更容易閱讀,做到這一點相反: 'List
你在哪裏實際添加列表到'tableData'?我看到你正在嘗試*在你的代碼中獲取*列表,但是如果它們不存在,你必須*添加*它們。請看我修改後的答案。 –