向已存在数组新增元素(不使用ArrayList)的代码异常排查
问题原因分析
- static方法访问非静态成员错误:
addValue被定义为static静态方法,但类中的data是普通成员变量,静态方法不能直接访问非静态的类成员,会直接触发编译错误。 - 数组赋值逻辑错误:你在循环拷贝原数组元素的过程中,每次都给
a[i+1]赋值为新值,会导致新数组中除了第一个原数组元素,中间所有位置都会被新值反复覆盖,最终只有原数组最后一个元素和末尾的新值符合预期,中间值全部错误。你认为单独测试代码正常只是认知偏差,实际输出和你想要的末尾追加效果完全不符。 - 没有更新类内的原数组:你创建的新数组
a只是方法内的局部变量,方法执行完就会被回收,没有赋值给类的data成员,下次调用方法还是基于原始的空数组操作,完全无法存储新增的值。
修正后的代码
public class Measurement { private int[] data; public Measurement() { data = new int[0]; } // 去掉static修饰,改为成员方法 public void addValue(int value) { int [] a = new int [data.length + 1]; // 先循环拷贝所有原数组元素 for(int i = 0; i < data.length; i++) { a[i] = data[i]; } // 循环结束后再给新数组的最后一位赋值新值 a[data.length] = value; // 将新数组赋值给类的data成员,完成更新 data = a; // 打印验证 for(int i: data) { System.out.println(i); } } // 测试用main方法 public static void main(String[] args) { Measurement measurement = new Measurement(); measurement.addValue(1); measurement.addValue(3); measurement.addValue(4); } }
修改说明
- 去掉了
addValue方法的static修饰符,改为普通成员方法,可以正常访问类的data成员变量 - 将新值的赋值操作移到循环外,仅在所有原数组元素拷贝完成后,给新数组的最后一个位置赋值
- 方法最后将新数组赋值给类的
data成员,保留新增的元素,后续调用可以基于更新后的数组继续添加
内容的提问来源于stack exchange,提问作者Neo
相关产品推荐
相关产品推荐

