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 然后循环将所有内容存储在数组中并返回数组。我在这个类中将数组声明为全局变量,所以我认为循环内的更改会直接影响全局数组。但它不起作用。我做错了什么?

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)。

简而言之,您在循环中一次又一次地“重新创建”数组。在您的方法中使用它之前,只初始化一次对象(例如在类构造函数中或在 main 中,在某种意义上使用它之前)。

一般来说,我建议你不要使用全局变量。搜索更多关于类封装,一个非常重要的面向对象编程原则:

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

于 2013-10-06T13:49:23.597 回答