2014-02-10 60 views
0

全部,將新的Java結果集對象分配給現有的對象,然後關閉原始的ResultSet對象會導致新創建的對象關閉?

對於稱爲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()」語句,那麼它工作正常嗎?

當然,我分配一個對象等於另一個對象後,它們變得互相排斥?

如果有人能解釋這裏發生了什麼。

回答

3

Java中的對象分配僅供參考,而不是價值。在簡單情況下,

int [] a = new int[] { 17 }; 
int [] b = a; 

b[0] = 11; 
// a[0] is 11 now. 

結果集相同。當你把它分配給新的變量時,你不克隆它。這只是一個不同的參考,同一個對象。

ResultSet不容易被複制,並且通常不是最好的方法是將它保持打開一段時間,並將其分配給對象字段。最好的做法是將數據複製到您自己的數據結構中,並儘快關閉ResultSet。

+0

在C++中,我可以完成這樣一個完整的任務,不需要引用它,我該如何複製> – kaleeway

+0

您可以查看受保護的clone()方法,它只是複製所有字段,非常像C結構分配。但它不被認爲是一個很好的使用方法。 – h22

+0

不要複製它,一旦你完成使用它,首先調用它來重置它。這是一個奇怪的用例。爲什麼你需要兩個對同一個ResultSet的引用? –

1

這兩個引用指向相同的結果集對象。

當你關閉一個,你也關閉另一個。
最好是說當你在其中一個引用上調用close時,
這會關閉結果集對象。因此另一個參考指向
到同一個(現在已關閉)的結果集對象。

這是發生在這裏。

1

在Java中,您正在處理引用。我一直認爲它們像指針一樣排序,所以在你的代碼中analysisSet = queryResults;你沒有複製對象,而只是添加另一個引用。所以你有一個ResultSet和2個引用。如果關閉此結果集(使用其中一個引用),那麼它在被兩者訪問時都會關閉。

相關問題