0

我在运行下面的代码时遇到了一点问题。当按下 gui 屏幕上的按钮时使用此代码。基本上,此按钮的功能是读取输入到 2 个文本字段中的文本,从 2 中导出第三个值,并使用 2d 数组将所有 3 个连续保存在 GUI 屏幕上的表格中。

但是,当在方法 addItem() 内的第 5 行执行它时,我得到一个 NullPointerException。saleData 是表中数据的二维数组。我已经实例化了 temp[][] 对象,它比 saleData 对象多 1 行,因为我需要向表中添加一行,然后我使 saleData=temp。在我尝试使用 OOP 为 GUI 工作创建一个单独的类之前,这段代码就像在 Gui 类中一样工作。nullpointer 异常指的是 temp 对象,我知道这一点是因为我打印了 temp 的值并且它是 null。

有没有人有任何想法?提前致谢。

public void addItem() {
    int len = saleData.length + 1;
    Object[][] temp = new Object[len][3];
    for (int k = 0; k < saleData.length; k++) {
        for (int i = 0; i < 3; i++) {
            temp[k][i] = ((DefaultTableModel) table.getModel()).getValueAt(k, i);
        }
    }
    tblContainer.removeComponent(table);
    try {
        int qty = Integer.parseInt(txtQty.getText());
        String item = (String) items.getSelectedItem();
        String sql = "Select Sell_price from stockInfo where parts like '" + item + "'";
        double total = 0;
        if (saleData.length != 1) {
            for (int i = 0; i < saleData.length; i++) {
                String sql2 = "Select sell_price from stockinfo where parts like '" + temp[i][1].toString() + "'";
                try {
                    System.out.println("Check 0");
                    pst = conn.prepareStatement(sql2);
                    System.out.println("Check 1");
                    rs = pst.executeQuery();
                    System.out.println("Check 2");
                    while (rs.next()) {
                        System.out.println("Check 3");
                        String qt = temp[i][0].toString();
                        temp[i][2] = Double.parseDouble(rs.getString("sell_price")) * Integer.parseInt(qt);
                        System.out.println("Check 4");
                    }
                } catch (Exception e) {
                    Dialog.show("Error", "Error 1: " + e, "OK", null);
                }
            }
        }
        try {
            pst = conn.prepareStatement(sql);
            rs = pst.executeQuery();
            while (rs.next()) {
                double price = Double.parseDouble(rs.getString("Sell_Price"));
                total = qty * price;
                try {
                    for (int m = 0; m < saleData.length; m++) {
                        for (int n = 0; n < 3; n++) {
                            ((DefaultTableModel) table.getModel()).setValueAt(m, n, temp[m][n]);
                        }
                    }
                    temp[saleData.length][0] = qty;
                    temp[saleData.length][1] = item;
                    temp[saleData.length][2] = total;
                    saleData = temp;
                    table = new Table(new DefaultTableModel(saleColumns, saleData, true));
                    tblContainer.addComponent(table);
                    ((TableLayout) table.getLayout()).setGrowHorizontally(true);
                    saleForm.revalidate();

                } catch (NullPointerException e) {
                }
            }
        } catch (SQLException e) {
            Dialog.show("Error", "SQL Error Record Sale", "OK", null);
        }
    } catch (NumberFormatException nfe) {
        Dialog.show("Error", "Please enter a valid quantity", "OK", null);
    }
}
4

1 回答 1

1

临时数组不能为空。你刚刚创建了它。

temp[k][i] 可以为空(顺便说一下,应该是),但这并不重要 - 它被分配了一个值。

如果一个维度temp不够大,你会得到一个ArrayIndexOutOfBoundsException

所以这留下了两件可以为空的事情(如果错误源于该行,而不是例如来自内部getValueAt(k,i)):

  • table
  • table.getModel()

使用调试器,它会让你的生活更轻松......

于 2013-09-21T18:02:24.837 回答