提问人: 提问时间:12/18/2008 最后编辑:BalusC 更新时间:4/19/2010 访问量:5356
遍历非 null 记录集时出现 Java NullPointerException
Java NullPointerException when traversing a non-null recordset
问:
我在 Sybase ASE 上运行一个查询,该查询生成一个查询,然后我遍历该查询并将内容写出到文件中。有时,这会抛出一个 ,指出 是 。但是,它会在打印出一两条记录后执行此操作。其他时候,使用相同的精确输入,我不会收到任何错误。ResultSet
NullPointerException
ResultSet
null
我无法始终如一地产生此错误。错误消息指向一行:
output.print(rs.getString(1));
由于某种原因,当查询需要更长的时间才能运行时,似乎会发生这种情况。到目前为止,记录集的回报非常小(4 到 7 条记录)。有时我不得不运行应用程序 3 或 4 次,然后错误就会停止,就好像查询正在“预热”一样。我已经手动运行了查询,似乎没有任何性能问题。
再次感谢!
答:
我希望你能做得很好,我的意思是在调用 rs.next() 之后。
根据规格。在任何情况下,ResultSet 对象都不应为 null。即使没有找到任何记录。发布代码片段和堆栈跟踪肯定会帮助我们为您提供更好的答案。
编辑:因为,错误指向那条线。它可能正在对 null String 调用 toString() 方法,从而导致 NullPointerException。但不确定,如果传递的参数是 String 类型,则它不会在标准输出 (System.out.println()) 中发生。但是您正在使用 output.print(),所以我不确定这一点。它可能在后台对传递的 String 参数调用 toString()。
评论
您确定是 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)
...
}
尝试包装用于访问数据的东西,例如:
if(rs!=null && rs.next()) {
阅读资料
}
如果仍然存在,将建议检查 null 本身的读取值。
评论
是什么类型的?方法处理吗?output
output.print
null
尝试在调用之前检查是否为 nullrs.getObject(1)
output.print(rs.getString(1))
评论
连接是否仍处于活动状态?是否正在使用连接池?
查看是否可以为该 JDBC 驱动程序启用调试日志记录。
查看是否可以将驱动程序升级到新版本。
我已经找到了这个问题的解决方案 - 数据库连接关闭得太早了。我没有意识到一旦数据库连接关闭,记录指针最终就会为 null - 我以为结果集会在系统内存中。
解决方案是在 while(rs.next()) 循环终止后关闭连接。
再次感谢。
评论