2013-10-06 76 views
0

我遇到問題。我想用包含不同信息的對象填充數組。 這裏是我的循環獲取循環外的信息

public FileRecord [] calcPos() throws IOException{ 
     for (int i = 0; i < getEFSFATmaxRecords(); i++){ 
     int blockNumber = i/5; 
     int recordOffset = i%5; 
     pos = (recordOffset*100+(getFsatPos() + 512 + 512*blockNumber)); 
     FileRecord rec = new FileRecord(pos,getHeader()); 
     array = new FileRecord[header.getMaxFileRecords()]; 

     array[i] = rec; 
     System.out.println("FileName: " + array[i].getFileName()); 


      } 
     return array; 
    } 

應該讓FileRecord的不同的對象。位置取決於運行變量i。 t 然後循環將所有內容存儲在數組中並返回數組。我聲明數組是一個全局變量,所以我認爲循環內的變化將直接影響全局數組。但它不起作用。我做錯了什麼?

+0

您正在每次迭代中重新創建陣列。 – Sohaib

回答

1

要重新初始化您的陣列中的每個迭代之前做到這一點。下面是你想要的代碼的正確版本:

public FileRecord [] calcPos() throws IOException{ 
    FileRecord[] array = new FileRecord[header.getMaxFileRecords()]; 
    for (int i = 0; i < getEFSFATmaxRecords(); i++){ 
     int blockNumber = i/5; 
     int recordOffset = i%5; 
     pos = (recordOffset*100+(getFsatPos() + 512 + 512*blockNumber)); 
     FileRecord rec = new FileRecord(pos,getHeader()); 
     array[i] = rec; 
     System.out.println("FileName: " + array[i].getFileName()); 
    } 
    return array; 
} 

正如沃格爾說,如果內環路header.getMaxFileRecords()變化那麼你的陣列可能耗盡的束縛。

解決方案:一個ArrayList應該工作。

3

陣列內你正在做的:

array = new FileRecord[header.getMaxFileRecords()]; 

這將重新創建陣列的每個互爲作用,你會失去存儲在它的記錄。

你需要循環

+2

問題:只要getMaxFileRecords()在循環中發生變化,就不可能,如果不是的話:祝賀完美答案;)) – Vogel612

+0

True!這將需要一點重新設計...也許使用一個集合,而不是一個數組 –

0

的問題是,你做的:(!其實,在循環內)

array = new FileRecord[header.getMaxFileRecords()]; 

裏面的方法每調用時。 這樣,您就可以爲變量「設置」一個新的FileRecord []對象(甚至更糟糕的是,由於在循環中完成了初始化,所以在您的方法中會發生多次)。 每次這個初始化發生時,變量「指向在內存中分配的新的FileRecord []對象。之前被數組」指向「的對象不再被使用,並且將被銷燬,何時是垃圾的責任收藏家。

http://javabook.compuware.com/content/memory/how-garbage-collection-works.aspx)。

在簡單的話,你一次又一次的循環內「重建」的陣列。 在類的構造函數在你的方法使用它(例如之前初始化對象只有一次或在主要使用之前,在某種意義上)

通常,我建議你不要使用全局變量秒。搜索更多關於類封裝的非常重要的面向對象編程原理:

http://www.tutorialspoint.com/java/java_encapsulation.htm)。