动态更新JTable时的nullpointerexception

时间:2012-12-12 01:48:13

标签: java swing nullpointerexception jtable

晚上好 我正在使用JTable,从之前的创建代码中获取代码。我想做的是动态更新表。我是如何做的是我将信息存储在链表中,然后通过列表拉动信息填充表格。问题是我得到一个空指针,我很困惑为什么。堆栈跟踪的开始是:

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行,其内容如下:

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

回顾过去类似的问题我不断看到人们提到确保一切都已初始化,我有。完整代码:

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];

任何帮助或建议?我想我已经看了并覆盖了我所有的基地,而且无法看到它。

2 个答案:

答案 0 :(得分: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)一次,并存储结果。一遍又一遍地做这件事是没有效率的。

答案 1 :(得分:1)

该行的问题是,

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

您只是声明JTable CartTable并且您没有在任何地方创建对象。在设置model之前,只需创建表对象,如

JTable CartTable = new JTable();

无需立即设置datacolumn names,您可以稍后创建包含数据和列名称的model,然后将此模型设置为表格。

P.S:请阅读What is a Null Pointer Exception? @Vincent Ramdhanie的回复帖子。 NPE发生了很好的解释。