All,
对于一个名为 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()"语句,那么它就可以正常工作吗?
当然,在我分配一个对象等于另一个对象之后,它们彼此相互排斥?
如果有人能解释这里发生的事情。
Java 中的对象赋值是通过引用而不是按值分配的。在简单的情况下
int [] a = new int[] { 17 };
int [] b = a;
b[0] = 11;
// a[0] is 11 now.
结果集也是如此。当您只是将其分配给新变量时,您不会克隆它。它只是对同一对象的不同引用。
ResultSet 不容易克隆,通常,将其保持打开状态一段时间不是分配给对象字段的最佳做法。最好将数据复制到您自己的数据结构中,并尽快关闭结果集。
这两个引用指向同一个结果集对象。
当您关闭一个时,您也会关闭另一个。
最好说,当您调用其中一个引用时,
这将关闭结果集对象。所以另一个参考是指向
到同一(现已关闭)结果集对象。
这正在这里发生。
在Java中,你正在处理引用。我总是认为它们有点像指针,所以在你的代码中,当你这样做时analysisSet = queryResults;
你不是在复制对象,你只是在添加另一个对它的引用。因此,您有一个结果集,其中包含 2 个对它的引用。如果关闭此结果集(使用其中一个引用),则在两者访问时将关闭该结果集。