You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中向同类型对象数组追加新对象时数据被异常覆盖如何解决?

问题原因与修复方案

1. 数组扩容方法逻辑错误

你的doubleDrillingArray方法中,currentDrillingArray = temp;语句放在了for循环内部,导致元素拷贝只完成了第一个就提前替换了原数组引用,后续循环都是从空的新数组中取值赋值,原数组除第一个元素外的所有内容全部丢失。
修复后的扩容方法如下:

private static drillingArray[] doubleDrillingArray(drillingArray[] currentDrillingArray)  {
        int dbleSize = currentDrillingArray.length*2;
        
        if (dbleSize > 0 && dbleSize < Integer.MAX_VALUE) {
            drillingArray[] temp = new drillingArray[dbleSize];
            for (int i = 0; i < currentDrillingArray.length; i++) {
                temp[i] = currentDrillingArray[i];
            }
            // 全部元素拷贝完成后再替换引用
            currentDrillingArray = temp;
        }else{
            System.out.println("no space");
        }
        return currentDrillingArray;
}

2. drillingArray类的存储数组为静态成员

你打印的所有内容都是最后一行,是因为drillingArray类中存储数据的data数组被static修饰,所有drillingArray实例共享同一个数组空间,每次新增数据都会覆盖之前的内容。
只需要删掉drillingArray类中data属性前的static修饰符,改为实例成员变量即可,每个实例会单独持有自己的存储数组,不会互相覆盖。

3. 文件读取逻辑冗余(可选优化)

你当前的读取逻辑会跳过文件第一行:先在while循环外读取了第一行,进入循环后立刻读取下一行覆盖了第一行的内容,标准读取写法参考:

String line;
int lineCount= 0;
BufferedReader br = new BufferedReader(new FileReader(fileName));
while((line = br.readLine()) != null) {
    String[] lineString = line.split(",");
    lineData = new drillingRecord(lineString);
    recordHolder = new drillingArray();
    recordHolder.add(lineData);
        
    if( lineCount==drillerArray.length){
        drillerArray = doubleDrillingArray(drillerArray);
    }
    drillerArray[lineCount]= new drillingArray(recordHolder);
    lineCount++;
}

内容的提问来源于stack exchange,提问作者taryn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 04:06:01