Java实例变量二维数组调用initialise方法后值未变更问题咨询
问题根因
- 核心问题是变量遮蔽:你在
initialise()方法内部重新定义了一个和类成员变量同名的局部变量Seat[][] seatArray,后续所有数组赋值操作都是针对这个局部变量生效的,方法执行结束后局部变量被回收,类成员变量seatArray完全没有被修改,所以调用toString()时访问的还是未被正确初始化的成员变量,就会出现异常。 - 额外存在两处逻辑错误:
- 类初始化时
numberOfRows和numberOfColumns默认值为0,如果你调用initialise()前没有给这两个变量赋值大于0的有效值,就算操作的是成员变量,创建的也是长度为0的空数组,无法正常存储元素 - 数组下标从0开始计数,你判断
j == this.numberOfColumns会直接触发数组越界异常
- 类初始化时
修复方案
- 删除
initialise()方法内部的局部变量声明,直接操作类成员变量:
将方法内第一行Seat[][] seatArray = new Seat[numberOfRows][numberOfColumns];修改为this.seatArray = new Seat[numberOfRows][numberOfColumns]; - 修复越界判断逻辑:将
j == this.numberOfColumns修改为j == this.numberOfColumns - 1 - 优化成员变量定义:既然数组需要根据行列数动态创建,类定义阶段不需要预先初始化10*7的无用数组,直接声明为
Seat[][] seatArray;即可 - 调整执行顺序:保证调用
initialise()之前,已经完成numberOfRows和numberOfColumns的有效值赋值
内容的提问来源于stack exchange,提问作者Exccc
相关产品推荐
相关产品推荐

