Java乘法表生成程序数组索引越界及功能异常排查求助
问题根源与修复方案
你的所有异常都来自printGrid方法里的循环逻辑错误,咱们一步步拆解问题:
核心错误点
循环遍历的维度完全搞反了
在createMultiplicationArray里,你创建的是int[width][height],意味着这个二维数组有width行,每行有height个元素(列数)。但printGrid里的第一个循环却用multiGrid[0].length(也就是列数height)作为终止条件,这会导致:- 当
width < height时,循环会尝试访问multiGrid[width]、multiGrid[width+1]...直到height-1,而这些行根本不存在,直接抛出Index n out of bounds for length n - 当
width > height时,循环只执行height次,只打印前height行,后面的行完全没处理,看起来像“突然停止”
- 当
错误引用了
multiGrid[1].length
第二个循环用multiGrid[1].length作为终止条件,这会在width=1时直接报错——因为multiGrid只有1行,multiGrid[1]是不存在的,这也是1×n或n×1形式完全无法工作的原因。缺少Scanner类的导入
原代码里用到了Scanner但没导入,会导致编译错误,这个也要补上。
修复后的完整代码
import java.util.Scanner; // 补充Scanner的导入 class Main { public static int[][] createMultiplicationArray(int width, int height){ int[][] multiGrid = new int[width][height]; for(int i = 0; i < width; i ++){ for(int j = 0; j < height; j ++){ multiGrid[i][j] = (i+1) * (j+1); } } return multiGrid; } public static void printGrid(int[][] multiGrid){ // 第一个循环遍历所有行,行数是multiGrid.length(也就是width) for(int i = 0; i < multiGrid.length; i ++){ // 第二个循环遍历当前行的所有列,用当前行的长度更安全 for(int j = 0; j < multiGrid[i].length; j ++){ // 如果想让打印更整齐,可以用System.out.printf("%4d", multiGrid[i][j]); 代替println System.out.println(multiGrid[i][j]); } } } public static void main(String[] args) { Scanner keyboard = new Scanner(System.in); System.out.println("Welcome to Multiplication Grid"); System.out.print("Enter a number for width: "); int width = keyboard.nextInt(); System.out.print("Thank you! Now, enter a number for height: "); int height = keyboard.nextInt(); int[][] multiGrid = createMultiplicationArray(width, height); printGrid(multiGrid); keyboard.close(); // 记得关闭Scanner,避免资源泄漏 } }
额外优化建议
如果想让乘法表打印得更整齐(不是每行一个数),可以把System.out.println改成System.out.printf("%4d", multiGrid[i][j]);,然后在每行结束后加一个System.out.println();,这样输出的表格会更美观。
内容的提问来源于stack exchange,提问作者Jakub Gluszko
相关产品推荐
相关产品推荐

