我收到以下错误:
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();
谢谢!
答案 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
不会受到影响...... ... :)