我正在Sybase ASE上运行一个生成ResultSet
的查询,然后我遍历并将内容写入文件。有时,这会抛出NullPointerException
,表明ResultSet
是null
。但是,它会在打印出一两个记录后执行此操作。其他时候,使用相同的输入,我将不会收到任何错误。
我无法始终如一地产生此错误。错误消息指向一行:
output.print(rs.getString(1));
由于某种原因,当查询运行时间稍长时,似乎会发生这种情况。到目前为止,记录集返回非常小(4到7条记录)。有时候我必须运行应用程序3到4次,然后错误就会停止,好像查询已经“热身”了。我手动运行查询,似乎没有任何性能问题。
再次感谢!
答案 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本身的读取值。