2016-06-08 26 views
0

我想將字符串分配給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語句的第一個塊?

+0

,我們指望秒,直到@BobMalooga關閉這個問題進行重複的,因爲「那麼,你應該知道,從每NPE火災同源「。 (http://stackoverflow.com/questions/37022248/nullpointerexception-when-trying-to-pass-data-to-a-fragment?noredirect=1#comment61598934_37022248) –

+1

分解它,使其更容易閱讀,做到這一點相反: 'List firstValue = tableData.get(rowIndex); firstValue.set(columnIndex,value);' 這將至少指出NPE來自哪裏 – Draken

+0

你在哪裏實際添加列表到'tableData'?我看到你正在嘗試*在你的代碼中獲取*列表,但是如果它們不存在,你必須*添加*它們。請看我修改後的答案。 –

回答

1

我沒有看到你初始化tableData實例:

private List<List<Object>> tableData; 

沒有合適的構造函數調用,這將是null並導致您所看到的例外。


另外(我不太清楚在這裏,因爲我的Java是不是很流利了):如果tableData不是null它可能是該get(index)方法 - 而不是拋出一個索引列界失誤 - 只是返回null如果在索引中沒有的元素,所以它很可能是你需要

tableData.get(rowIndex).set(columnIndex, value); 

改變這一行是這樣的:

List<string> elements = tableData.get(rowIndex); 
if (elements == null) 
{ 
    // Create elements list and add it to tableData 
    ... 
} 
elements.set(columnIndex, value); 
+0

我已經在編輯中實現了這一點,但我需要將tableData更改爲ArrayList,因爲List不能在'tableData.add(rowIndex,new List <>())中實例化;' – aliaksei

+0

並且它是否解決了問題? –

+0

它解決了它,並根據編輯創建了一個新的。它現在顯示IndexOutOfBounds – aliaksei

1

那麼,如果rowIndexcolumnIndex,和value都明確規定,然後要麼tableData爲空或從get獲得的內List爲空。

您可以其中一個被分離的語句轉換成線確定:

List<Object> row = tableData.get(rowIndex); //NPE means tableData is null 
row.set(columnIndex, value); //NPE means inner List is null