有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

通过ResultSet反向检索数据时发生java NullPointerException

Statement createStatement = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet executeQuery = createStatement.executeQuery("select * from stu");
executeQuery.afterLast();
while (executeQuery.previous()) {   //15th line<--exception occurs at this place after first record is retrieved
    int rollno = executeQuery.getInt(1);
    System.out.println("rollno " + rollno + " name " + executeQuery.getString(2));
    if (rollno == 1) {
        if (createStatement.executeUpdate("update stu set name=" + "'vinay'" + "where rollno=1") >= 1) {
            System.out.println("row updated");      
        }
    }
}

输出:

rollno 1 name vinay

行更新

//检索到第一条记录后,它会引发异常

Exception in thread "main" java.lang.NullPointerException
   at oracle.jdbc.driver.ScrollableResultSet.previous(ScrollableResultSet.java:630)
   at com.vk.db.ScrollableResultSet.main(ScrollableResultSet.java:15)

共 (2) 个答案

  1. # 1 楼答案

    尝试改变

     executeQuery.afterLast(); 
    

    executeQuery.last();                   
    

    或者使用类似的while循环

     while (executeQuery.next()) {
       code....
        }
    
  2. # 2 楼答案

    错误原因是回收语句对象。请尝试以下代码/

       Statement createStatement = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
            ResultSet executeQuery = createStatement.executeQuery("select id, name from stu");       
            executeQuery.afterLast();
            while (executeQuery.previous()) {   
                int rollno = executeQuery.getInt("id");
                System.out.println("rollno " + executeQuery.getString("id") + " name " + executeQuery.getString("name"));
                if (rollno == 1) {
                    executeQuery.updateString("NAME", "new value");
                    executeQuery.updateRow();
                }
            }
    

    注意。查询不能使用SELECT * from table