java.lang.NullPointerException - ResultSet

时间:2011-11-11 15:22:19

标签: java connection nullpointerexception resultset

我收到以下错误:

java.lang.NullPointerException
    at oracle.jdbc.driver.ScrollableResultSet.cacheRowAt(ScrollableResultSet.java:2086)
    at oracle.jdbc.driver.ScrollableResultSet.isValidRow(ScrollableResultSet.java:2060)
    at oracle.jdbc.driver.ScrollableResultSet.next(ScrollableResultSet.java:347)
    at website.web.InboxReader.getkeywordImportance(InboxReader.java:832)
    at website.web.InboxReader.main(InboxReader.java:54)

53表中有Mail行,1表中有keyword行。在调试时,只要执行该行kstmt.executeUpdate("UPDATE KEYWORD SET IMPORTANCE = IMPORTANCE + 1.0 WHERE SKEYWORD = '" + s2 + "'");,它就会再次转到keyword set.next()并抛出异常。

以下是代码:

Connection connection = connectToDatabase();
        Statement mstmt = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
        String s1,s2;
        ResultSet mailset = mstmt.executeQuery("SELECT * from MAIL");
        System.out.println("hello in getImportance beg"); 
        //mailset.beforeFirst();
        while(mailset.next())
        {               
            System.out.println("hello in first while"); 
            Statement kstmt = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
            ResultSet keywordset = kstmt.executeQuery("SELECT * FROM KEYWORD");
            while(keywordset.next())
            {
                s1=mailset.getString("SUBJECT");
                System.out.println("Subject: "+s1);
                s2=keywordset.getString("SKEYWORD");
                System.out.println("Keyword: "+s2);
                if(s1.contains(s2))
                {
                    System.out.println("hello in if");  
                    kstmt.executeUpdate("UPDATE KEYWORD SET IMPORTANCE = IMPORTANCE + 1.0 WHERE SKEYWORD = '" + s2 + "'");  

                }
            }
            keywordset.close();
        }
        mailset.close();
        connection.close();

谢谢!

4 个答案:

答案 0 :(得分:3)

如果你看一下这条似乎有问题的一行:

kstmt.executeUpdate("UPDATE KEYWORD SET IMPORTANCE ='" + (keywordset.getFloat("IMPORTANCE") + 1.0) + "'");

你应该仔细检查一下这个电话

keywordset.getFloat("IMPORTANCE")

这最常见的原因是记录的列重要性为空,或列可能不存在。只是为了调试你试试

keywordset.getFloat(0);

或者您知道的列的id是否存在以查看呼叫是否有效。

您是否尝试删除COMMIT语句?因为通常除非您另行指定,否则数据会自动提交,因此您无需在语句后调用提交,并且如果您已将auto_commit指定为false,那么提交您应该执行con.commit()而不是通过更新调用它声明

答案 1 :(得分:2)

请参阅此处的文档 http://download.oracle.com/javase/tutorial/jdbc/basics/retrieving.html

无需像之前预期的那样调用beforeFirst。

public static void viewTable(Connection con) throws SQLException {
    Statement stmt = null;
    String query = "select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from " + dbName + ".COFFEES";
    try {
      stmt = con.createStatement();
      ResultSet rs = stmt.executeQuery(query);
      while (rs.next()) {
        String coffeeName = rs.getString("COF_NAME");
        int supplierID = rs.getInt("SUP_ID");
        float price = rs.getFloat("PRICE");
        int sales = rs.getInt("SALES");
        int total = rs.getInt("TOTAL");
        System.out.println(coffeeName + "\t" + supplierID + "\t" + price + "\t" + sales + "\t" + total);
      }
    } catch (SQLException e ) {
      JDBCTutorialUtilities.printSQLException(e);
    } finally {
      if (stmt != null) { stmt.close(); }
    }
  }

答案 2 :(得分:1)

您是否尝试过在没有keywordset.beforeFirst()和mailset.beforeFirst()的情况下运行它?这不是必需的,它可能在ResultSet中创建了一个问题。

答案 3 :(得分:0)

kstmt.executeUpdate("UPDATE KEYWORD SET IMPORTANCE = IMPORTANCE + 1.0 WHERE SKEYWORD = '" + s2 + "'");  

当此行在您的代码中执行时,您的keywordset ResultSet对象将会更改,因为所有执行方法都会对ResultSet产生影响。 Statement接口中的所有执行方法都隐式关闭一个statment的当前ResultSet对象(如果存在一个open对象)。  您需要做的是为运行此查询创建一个单独的语句对象,以便关键字集ResultSet不会受到影响...... ... :)