-3

このコードで 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 ステートメントが実行されないのはなぜですか? 誰かがこの問題を手伝ってくれませんか。

4

2 に答える 2

1

スタック トレースを取得できないため (サーバー ログにアクセスできませんか?)、できることはすべての可能な項目を null チェックすることだけです。

例えば

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)
于 2012-06-21T02:12:50.013 に答える
0

スタック トレースやコンパイル可能なコードがなければ、あるいは少なくともクラッシュが発生した行を教えてくれなければ、直接的な答えは得られません。

ただし、これを行うと、おそらく次のことがわかります。

  1. = null をすべて取り除きます。
  2. すべての変数を final に変更します。

これら 2 つのことにより、使用する前に変数を割り当てる必要があります。つまり、誤って変数を割り当てるのを忘れて、現在与えている null 値で使用することはできません。

これは、いくつかの新しい変数を追加する必要があることを意味する場合があります。最終的な変数は一度しか割り当てることができません。これは、一般に、1 つの変数、1 つの目的で行うのが賢明なことです。変数が似ているという理由だけで変数を再利用しないでください。

また、catch に何も指定せずに try/catch を実行してから、catch の後にコードを追加しないようにしてください (コードの場合はそうではないようです)。

そうすることで、問題を絞り込むのに役立ち、修正することさえできます。

于 2012-06-21T02:11:37.557 に答える