2012-12-12 42 views
-1

晚上好 我正在使用JTable,从此之前的创建中获取代码。我想要做的是动态更新表格。我如何做是因为我将信息存储在链接列表中,然后浏览列表中的信息以填充表格。问题是我得到一个空指针,我很困惑,为什么。我的堆栈跟踪的起点是:动态更新JTable时出现nullpointer异常

CartTable.setModel(new DefaultTableModel(data,ColumnNames)); 

通过类似于过去的问题,我不断看到人们提以确保展望:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at main$CoverSelection.actionPerformed(main.java:225) 
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) 
at java.awt.Component.processMouseEvent(Unknown Source) 

显然,这是在线路225是全文发生一切都已初始化,我有。完整的代码:

data = new Object[1][4]; 
      //CartTable.setModel(new DefaultTableModel(data,ColumnNames)); 
      while(abc<OrderList.size()) 
      { 
       System.out.println(OrderList.get(abc).getIsbn()); 
       System.out.println(OrderList.get(abc).GetTitle()); 
       System.out.println(OrderList.get(abc).getQuantity()); 
       System.out.println(Double.toString(OrderList.get(abc).getPrice())); 
       //data = new Object[1][4]; 
       //CartTable.setModel(new DefaultTableModel(data,ColumnNames)); 
       if (data== null) 
       { 
        data = new Object[1][4]; 
        data[0][0] = OrderList.get(abc).getIsbn(); 
        data[0][1] = OrderList.get(abc).GetTitle(); 
        data[0][2] = OrderList.get(abc).getQuantity(); 
        data[0][3] = Double.toString(OrderList.get(abc).getPrice()); 
        CartTable.setModel(new DefaultTableModel(data,ColumnNames)); 
       } 
       else 
       { 
        System.out.println("In the else part"); 

        Object [][] temp = new Object[data.length+1][4]; 
        for (int rowCt =0; rowCt < data.length; rowCt++) 
        { 
         for (int colCt=0; colCt< 4; colCt++) 
         { 
          temp[rowCt][colCt] = data[rowCt][colCt]; 
         } 
        } 
        temp[data.length][0] = OrderList.get(abc).getIsbn(); 
        temp[data.length][1] = OrderList.get(abc).GetTitle(); 
        temp[data.length][2] = OrderList.get(abc).getQuantity(); 
        temp[data.length][3] = OrderList.get(abc).getPrice(); 
        data = temp; 
        System.out.println("data length in else: "+data.length); 
        CartTable.setModel(new DefaultTableModel(data,ColumnNames));//line 225 
      } 

代码工作和循环切换if语句是数据为空,但再然后,当它通过它来打通else语句另一行中的第一种是当它给了我错误。我的初始化程序是:

private Object[][] data = null; 
private JTable CartTable; 
String[] ColumnNames=new String[4]; 

任何帮助或建议?我想我已经看过并覆盖了所有的基地,只是看不到它。

+1

为了更快提供更好的帮助,请发布[SSCCE](http://sscce.org/)。 –

+2

当您尝试调用null上的方法或字段时,VM会引发NullPointerException。 CartTable是否为空? (注意:字段和变量应该是lowerCamelCase。) – ignis

+2

''我想我已经看过并覆盖了我的所有基地,......“但是,为什么你没有向我们展示你初始化违规行的唯一变量,可以导致这个异常,JTable本身?你似乎错过了最重要的基地! –

回答

1

与行的问题是,

CartTable.setModel(new DefaultTableModel(data,ColumnNames)); 

你只是声明JTable CartTable,你是不是为它创建对象的任何地方。在您设定的model刚刚创建的表对象一样,

JTable CartTable = new JTable(); 

无需设置datacolumn names立即以后可以用数据和列名建立一个model,然后将该模型表。

P.S:请阅读回答@Vincent Ramdhanie What is a Null Pointer Exception?。发生的NPE被解释得非常好。

1

A)Java不是C/C++。 Java中没有“为局部变量自动创建对象”的概念。所有对象都必须显式创建。所以,总是

Object o = new Object(); 

如果你不想在以后做o.something()时得到NPEx。

而且,在这里你必须:

private JTable CartTable = new JTable(/*Object[][]*/ rowData, /*Object[]*/ columnNames); 

B)使用OrderList.get(ABC)只有一次,并将结果。一遍又一遍的做效率不高。