获取循环外的信息

时间:2013-10-06 13:33:00

标签: java variables loops

我有一个问题。我想用包含不同信息的对象填充数组。 这是我的循环

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

3 个答案:

答案 0 :(得分:3)

在你正在做的阵列中:

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

这将在每次交互时重新创建数组,并且您将丢失存储在其中的记录。

你需要在循环之前执行此操作

答案 1 :(得分: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应该可以工作。

答案 2 :(得分:0)

问题是你这样做:

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

每次调用方法时都要隐藏方法(事实上,在循环内部!)。 这样,您将“FileRecord []对象”设置“到变量中(更糟糕的是,在循环中完成初始化时,这会在您的方法中多次发生)。 每次初始化发生时,变量“指向在内存中分配的新FileRecord []对象。之前由数组”指向“的Object不再使用,并且将被销毁,when何时是垃圾收集器的责任

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

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

通常,我建议您不要使用全局变量。在类封装上搜索更多内容,这是一个非常重要的面向对象编程原理:

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