Java调用fillMatrixA方法无输出 全写main中可运行问题排查
问题原因
核心bug出在静态成员的初始化顺序上:
Java类的静态成员会在类加载阶段按声明顺序完成初始化,你写的三个静态成员执行逻辑是:
- 首先初始化
size,int类型静态变量默认值为0 - 紧接着执行
new int[size][size]给matrixA分配内存,这时候size还是默认的0,最终创建出来的是一个长度为0的空二维数组 - 最后初始化
randomNumber实例。
等你后面调用setSize()方法修改size的值时,matrixA早就完成初始化了,数组长度一旦创建就固定,不会跟着size的变化自动调整。这时候fillMatrixA()里的外层循环判断条件是i < matrixA.length,也就是i < 0,循环体一次都不会执行,自然没有任何输出。
你把所有逻辑写在main方法里能正常运行,是因为代码顺序变成了「先读取用户输入给size赋值→再用有效size创建数组→再遍历数组填充打印」,数组长度是正确的,循环可以正常执行。
修复方法
不要在静态成员声明位置直接初始化二维数组,把数组创建的逻辑挪到拿到用户输入的有效size之后:
- 调整静态成员声明,数组只声明不初始化:
static int size; static int matrixA[][]; static Random randomNumber = new Random();
- 修改
setSize()方法,读取到输入值之后再创建数组:
static void setSize() { Scanner input = new Scanner(System.in); System.out.println("Enter size"); size = input.nextInt(); matrixA = new int[size][size]; // 拿到合法size后再分配数组内存 }
- main方法里保证先调用
setSize(),再调用fillMatrixA()即可正常运行。
注意:如果调用顺序反过来,先执行
fillMatrixA()再执行setSize(),会因为matrixA还没初始化直接抛空指针异常。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

