Java传递二维char数组为方法参数时出现数组索引越界错误
问题根因
报错的核心原因是数组创建时机错误:
- 类的静态int成员变量
row、column默认初始值为0,你在main方法中先执行了char[][] table = new char[row][column];,此时还没调用enterRowColumn()给两个变量赋值,创建出来的二维数组第一维长度为0,是个空数组。 - 数组一旦创建完成,长度就固定了,后续调用
enterRowColumn()修改静态变量row、column的值,不会改变已经创建好的table数组的尺寸。 - 执行初始化方法循环时,尝试访问空数组的索引0位置,就会抛出
Index 0 out of bounds for length 0的越界错误,和第90行的赋值逻辑本身没有关系。
修复方案
调整main方法中的执行顺序:先调用输入方法拿到合法的行列值,再创建对应尺寸的二维数组,最后执行初始化操作。
修正后的核心代码如下:
public class Cinema { public static int row, column, x, y; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 第一步:先获取用户输入的行列值,给静态变量row、column赋值 enterRowColumn(); // 第二步:拿到正确的行列值后,再创建对应尺寸的二维数组 char[][] table = new char[row][column]; // 第三步:初始化数组 initializeTable(table); } // 原有输入行列的方法保持原有逻辑即可 public static void enterRowColumn() { Scanner sc = new Scanner(System.in); System.out.print("请输入行数:"); row = sc.nextInt(); System.out.print("请输入列数:"); column = sc.nextInt(); } public static void initializeTable(char[][] table) { for (int i = 0; i < row; i++) { for (int j = 0; j < column; j++) { table[i][j] = 'S'; } } } }
可选优化
可以在创建数组前增加校验逻辑,判断用户输入的row、column是否为正整数,避免输入0、负数时再次触发数组尺寸非法的问题。
内容的提问来源于stack exchange,提问作者toprakunal
相关产品推荐
相关产品推荐

