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

时间:2008-12-18 02:48:11

标签: java jdbc nullpointerexception resultset

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

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

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

由于某种原因,当查询运行时间稍长时,似乎会发生这种情况。到目前为止,记录集返回非常小(4到7条记录)。有时候我必须运行应用程序3到4次,然后错误就会停止,好像查询已经“热身”了。我手动运行查询,似乎没有任何性能问题。

再次感谢!

6 个答案:

答案 0 :(得分:3)

你确定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)
    ...
}

答案 1 :(得分:2)

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

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

修改 因为,错误指向该行。它可能在 null String上调用 toString()方法,导致NullPointerException。但不确定,如果传递的参数是String类型,则不会在标准输出(System.out.println())中发生。但是你正在使用 output.print(),所以我不确定这一点。它可能是在场景后面传递的String参数上调用 toString()

答案 2 :(得分:1)

output的类型是什么? output.print方法是否处理null

在调用rs.getObject(1)

之前,请尝试检查output.print(rs.getString(1))是否为空

答案 3 :(得分:0)

连接是否仍然有效?你在使用连接池吗?

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

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

答案 4 :(得分:0)

我找到了解决这个问题的方法 - 数据库连接太早关闭了。我没有意识到,一旦数据库连接关闭,记录指针最终会变为空 - 我认为结果集将在系统内存中。

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

再次感谢。

答案 5 :(得分:-2)

尝试包装用于访问数据的内容,如:

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

//阅读内容

}

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