3

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

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

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

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

再次感谢!

4

6 回答 6

3

您确定是 ResultSet 为空,而不是 rs.getString(1)?

这是一个典型的 Java 查询

preparedStatement.setLong(1, primaryKey);
ResultSet rs = preparedStatement.executeQuery();
while (rs.next())
{
  String foo = rs.getString(1);
  if (foo != null)
    ...
}
于 2008-12-18T03:15:37.077 回答
2

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

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

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

于 2008-12-18T03:11:14.620 回答
1

是什么类型的outputoutput.print方法处理吗null

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

于 2008-12-18T08:31:13.820 回答
0

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

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

再次感谢。

于 2009-01-21T13:44:35.163 回答
0

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

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

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

于 2008-12-18T13:50:47.420 回答
-2

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

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

// 读取内容

}

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

于 2008-12-18T04:04:48.193 回答