遍历非 null 记录集时出现 Java NullPointerException

Java NullPointerException when traversing a non-null recordset

提问人: 提问时间:12/18/2008 最后编辑:BalusC 更新时间:4/19/2010 访问量:5356

问:

我在 Sybase ASE 上运行一个查询,该查询生成一个查询,然后我遍历该查询并将内容写出到文件中。有时,这会抛出一个 ,指出 是 。但是,它会在打印出一两条记录后执行此操作。其他时候,使用相同的精确输入,我不会收到任何错误。ResultSetNullPointerExceptionResultSetnull

我无法始终如一地产生此错误。错误消息指向一行:

output.print(rs.getString(1));

由于某种原因,当查询需要更长的时间才能运行时,似乎会发生这种情况。到目前为止,记录集的回报非常小(4 到 7 条记录)。有时我不得不运行应用程序 3 或 4 次,然后错误就会停止,就好像查询正在“预热”一样。我已经手动运行了查询,似乎没有任何性能问题。

再次感谢!

java JDBC NullPointerException 结果集

评论

0赞 Alan Moore 12/18/2008
我想知道这是否可能是线程问题。您的应用是多线程的吗?您是否在多核计算机上运行它?

答:

2赞 Adeel Ansari 12/18/2008 #1

我希望你能做得很好,我的意思是在调用 rs.next() 之后。

根据规格。在任何情况下,ResultSet 对象都不应为 null。即使没有找到任何记录。发布代码片段和堆栈跟踪肯定会帮助我们为您提供更好的答案。

编辑:因为,错误指向那条线。它可能正在对 null String 调用 toString() 方法,从而导致 NullPointerException。但不确定,如果传递的参数是 String 类型,则它不会在标准输出 (System.out.println()) 中发生。但是您正在使用 output.print(),所以我不确定这一点。它可能在后台对传递的 String 参数调用 toString()。

评论

0赞 Miserable Variable 12/18/2008
我不知道输出的类型是什么,但我怀疑任何传递 String 的方法都会再次在该对象上调用 toString
0赞 Adeel Ansari 12/18/2008
关于 System.out.println(),您的疑问是正确的。但我在这里不确定。编辑了帖子以匹配场景。谢谢,赫马尔。
3赞 Paul Tomblin 12/18/2008 #2

您确定是 ResultSet 为 null 而不是 rs.getString(1) 吗?

这是一个典型的 Java 查询

preparedStatement.setLong(1, primaryKey);
ResultSet rs = preparedStatement.executeQuery();
while (rs.next())
{
  String foo = rs.getString(1);
  if (foo != null)
    ...
}
-2赞 Nrj 12/18/2008 #3

尝试包装用于访问数据的东西,例如:

if(rs!=null && rs.next()) {

阅读资料

}

如果仍然存在,将建议检查 null 本身的读取值。

评论

0赞 Alan Moore 12/18/2008
我相信 Tim 正在寻找一种方法来解决问题,而不是解决它。
0赞 Nrj 12/19/2008
这不是解决方法。这将帮助他确定变为空的特定值。我相信这是开始的方式。
1赞 Miserable Variable 12/18/2008 #4

是什么类型的?方法处理吗?outputoutput.printnull

尝试在调用之前检查是否为 nullrs.getObject(1)output.print(rs.getString(1))

评论

0赞 Adeel Ansari 12/18/2008
我不认为rs.getObject()值得一试。发布堆栈跟踪效果最佳。
0赞 Sarel Botha 12/18/2008 #5

连接是否仍处于活动状态?是否正在使用连接池?

查看是否可以为该 JDBC 驱动程序启用调试日志记录。

查看是否可以将驱动程序升级到新版本。

0赞 Tim 1/21/2009 #6

我已经找到了这个问题的解决方案 - 数据库连接关闭得太早了。我没有意识到一旦数据库连接关闭,记录指针最终就会为 null - 我以为结果集会在系统内存中。

解决方案是在 while(rs.next()) 循环终止后关闭连接。

再次感谢。