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
相关产品推荐
相关产品推荐

