所有
对于名为Analyze的类及其构造函数Analyze,它将Java JDBC Resultset对象作为参数。
private Resultset analysisSet
public void Analyse(ResultSet queryResults)
{
analysisSet = queryResults;
queryResults.close();
}
public void doSomeStuff()
{
analysisSet.next() //throws SQL Exception "Closed Resultset : next"
}
但是,如果我注释掉“queryResults.close()”语句,那么它可以正常工作吗?
当我将一个物体分配给另一个物体时,它们彼此互相排斥?
如果有人能解释这里发生的事情。
答案 0 :(得分:3)
Java中的对象赋值是引用,而不是值。在简单的情况下
int [] a = new int[] { 17 };
int [] b = a;
b[0] = 11;
// a[0] is 11 now.
结果集相同。当您将其分配给新变量时,不要克隆它。它只是一个不同的参考对象。
无法轻松克隆ResultSet,一般情况下,保持打开一段时间并将其分配给对象字段并不是最佳做法。最好将数据复制到您自己的数据结构并尽快关闭ResultSet。
答案 1 :(得分:1)
这两个引用指向相同的结果集对象。
当你关闭一个时,你也会关闭另一个 最好是说当你在其中一个参考上打电话时, 这会关闭结果集对象。所以另一个参考是指向 到同一个(现在关闭的)结果集对象。
这发生在这里。
答案 2 :(得分:1)
在Java中,您正在处理引用。我总是认为它们就像指针一样,所以当你执行analysisSet = queryResults;
时,你的代码中没有复制对象,只是添加了另一个引用。所以你有一个ResultSet,有2个引用它。如果关闭此结果集(使用其中一个引用),则在两者都访问时它将关闭。