数据库插入语句的Java NullPointerException

时间:2012-06-21 01:56:35

标签: java nullpointerexception sql-update

为什么此代码会导致NullPointerException?

ArrayList<OrdersAttr> ls = new ArrayList<OrdersAttr>();
OrdersAttr myOrder = null;
String connString = ConnStr.connString;
String connString2 = ConnStr.connString2;

Connection conn = null;
Connection conn2 = null;
Statement stmnt = null;
Statement stmnt2 = null;
String selectString = null;
String insertString = null;
String insertString2 = null;
String updateString = null;
int orderId = 0;

conn = DriverManager.getConnection(connString);
stmnt = conn.createStatement();

selectString = "SELECT A.ORDERID AS ORDERID FROM APP.ORDERS a, APP.CUSTOMER b WHERE ORDERSTATUS = 'NEW ORDER' AND " + " branchid=" + branchid + "and a.CUSTEMAIL = b.EMAIL";

ResultSet rs = stmnt.executeQuery(selectString);
while (rs.next()) {
    orderId = rs.getInt("ORDERID");
    myOrder = new OrdersAttr();
    myOrder.id = rs.getInt("ORDERID");
    myOrder.date = rs.getString("datetime");
    myOrder.orderitems = rs.getString("orderitems");
    myOrder.orderquantity = rs.getString("orderquantity");
    myOrder.ordersizes = rs.getString("ordersizes");
    myOrder.address = rs.getString("floor_f") + " "
        + rs.getString("building_f") + " "
        + rs.getString("street_f") + " "
        + rs.getString("area_subdivision_district_f") + " "
        + rs.getString("city_f");
    myOrder.name = rs.getString("firstname") + " " + rs.getString("lastname");
    myOrder.status = rs.getString("ORDERSTATUS");
    myOrder.contact = rs.getString("CONTACT");

    conn2 = DriverManager.getConnection(connString2);
    stmnt2 = conn2.createStatement();

    insertString = "INSERT INTO APP.ORDERS VALUES ('" + myOrder.id + "','" + myOrder.date + "','" + myOrder.orderitems + "','" + myOrder.orderquantity + "','" + myOrder.ordersizes + "','" + myOrder.status + "')";
    insertString2 = "INSERT INTO APP.CUSTOMER VALUES ('" + myOrder.id + "','" + myOrder.name + "','" + myOrder.address + "','" + myOrder.contact + "')";

    stmnt2.executeUpdate(insertString);
    stmnt2.executeUpdate(insertString2);

    updateString = "UPDATE APP.ORDERS SET ORDERSTATUS = 'SENT TO LOCAL BRANCH'";
    stmnt.executeUpdate(updateString);
}

执行UPDATE字符串并更新数据库,但为什么它返回NullPointerException并且不执行INSERT语句?有人可以帮我解决这个问题。

2 个答案:

答案 0 :(得分:1)

由于您无法获得堆栈跟踪(无法访问服务器日志?),您只能检查每个可能的项目。

e.g。

conn = DriverManager.getConnection(connString);
stmnt = conn.createStatement();
// Without having DriveManager source, how do you know conn can't be null?
// This is potentially unsafe.



ResultSet rs = stmnt.executeQuery(selectString);
while (rs.next()) {
// Could rs be null (e.g. if the select string had an SQL syntax problem)

答案 1 :(得分:0)

没有堆栈跟踪或可编译的代码,或者至少告诉我们崩溃发生在你的哪一行,你将无法得到直接答案。

但是,如果你这样做,你可能会想出来:

  1. 摆脱所有= null。
  2. 将所有变量更改为final。
  3. 这两件事会迫使你在使用它们之前分配变量,这意味着你不会意外忘记分配一个并使用你现在给它的空值。

    这可能意味着您需要添加一些新变量,最终变量只能分配一次。这通常是一个理智的事情 - 一个变量,一个目的。不要仅仅因为它们相似而重用变量。

    另外,请确保你没有在catch中执行任何try / catch,然后在catch之后使用代码(看起来代码不是这样)。

    这样做可以帮助您缩小问题范围,甚至可以解决问题。