Java 从循环之外获取信息

Java 从循环之外获取信息,java,variables,loops,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()

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

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;
    }
public FileRecord[]calcPos()引发IOException{
对于(int i=0;i
它应该为FileRecord创建不同的对象。位置取决于运行变量i。T
然后循环将所有内容存储在数组中并返回数组。我在这个calss中将数组声明为全局变量,所以我认为循环中的更改会直接影响全局数组。但它不起作用。我做错了什么?

在您正在执行的阵列中:

array = new FileRecord[header.getMaxFileRecords()];
这将在每次交互时重新创建数组,并且您将丢失其中存储的记录


您需要在执行阵列中的循环之前执行此操作:

array = new FileRecord[header.getMaxFileRecords()];
这将在每次交互时重新创建数组,并且您将丢失其中存储的记录


在每次迭代中重新初始化数组之前,需要先执行此操作。以下是所需代码的正确版本:

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;
}
public FileRecord[]calcPos()引发IOException{
FileRecord[]数组=新的FileRecord[header.getMaxFileRecords()];
对于(int i=0;i
正如vogel所说,如果
header.getMaxFileRecords()
在循环中发生更改,那么您的数组可能会超出范围


解决方案:ArrayList应该可以工作。

您正在每次迭代中重新初始化数组。以下是所需代码的正确版本:

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;
}
public FileRecord[]calcPos()引发IOException{
FileRecord[]数组=新的FileRecord[header.getMaxFileRecords()];
对于(int i=0;i
正如vogel所说,如果
header.getMaxFileRecords()
在循环中发生更改,那么您的数组可能会超出范围


解决方案:ArrayList应该可以工作。

问题在于您需要:

array = new FileRecord[header.getMaxFileRecords()];
每次调用它时(实际上,在循环内部!)都在方法内部。 这样,您就为变量“设置”了一个新的FileRecord[]对象(更糟糕的是,在循环中初始化时,这种情况在方法中会发生很多次)。 每次进行此初始化时,变量“指向内存中分配的新FileRecord[]对象。以前由数组“指向”的对象不再使用,将被销毁,这是垃圾收集器的责任

()

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

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


()。

问题是你会:

array = new FileRecord[header.getMaxFileRecords()];
每次调用它时(实际上,在循环内部!)都在方法内部。 这样,您就为变量“设置”了一个新的FileRecord[]对象(更糟糕的是,在循环中初始化时,这种情况在方法中会发生很多次)。 每次进行初始化时,变量“都指向内存中分配的新FileRecord[]对象。以前被数组“指向”的对象不再使用,将被销毁,这是垃圾收集器的责任

()

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

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


()。

您在每次迭代中都在重新创建数组。您在每次迭代中都在重新创建数组。问题:只要getMaxFileRecords()在循环中发生更改,就不可能了,否则:恭喜您得到了完美的答案;)真的!那需要重新设计一下。。。可能使用集合而不是数组问题:只要getMaxFileRecords()在循环中发生更改,就不可能了,否则:恭喜您获得了完美的答案;)真的!那需要重新设计一下。。。可能使用集合而不是数组