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 次に、ループはすべてを配列に格納し、配列を返します。この calss で配列をグローバル変数として宣言したので、ループ内の変更がグローバル配列に直接影響すると思いました。しかし、うまくいきません。私が間違っていることは何ですか?

4

3 に答える 3

3

あなたがやっている配列内で:

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

これにより、反復ごとに配列が再作成され、そこに格納されているレコードが失われます。

ループの前にこれを行う必要があります

于 2013-10-06T13:40:24.747 に答える
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;
}

vogel が言うようheader.getMaxFileRecords()に、ループ内で変更が行われると、配列が範囲外になる可能性があります。

解決策: ArrayList が機能するはずです。

于 2013-10-06T13:44:15.433 に答える
0

問題は、あなたがすることです:

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

メソッドが呼び出されるたびにメソッドの内側 (実際には、ループの内側です!)。このようにして、新しい FileRecord[] オブジェクトを変数に「設定」します (さらに悪いことに、初期化がループで行われるため、メソッドで何度も発生します)。この初期化が発生するたびに、変数は「メモリに割り当てられた新しい FileRecord[] オブジェクトを指します。以前に配列によって「指された」オブジェクトは使用されなくなり、破棄されます。ガベージ コレクターの責任はいつですか。 .

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

簡単に言えば、ループ内で配列を何度も「再作成」しています。メソッドで使用する前に、オブジェクトを 1 回だけ初期化します (たとえば、クラス コンストラクターまたはメインで、ある意味で使用する前に)。

通常、グローバル変数は使用しないことをお勧めします。非常に重要なオブジェクト指向プログラミングの原則であるクラスのカプセル化についてさらに検索します。

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

于 2013-10-06T13:49:23.597 に答える