Java:使用子串生成矩阵时触发ArrayIndexOutOfBoundsException异常
我来帮你揪出代码里的问题,你遇到的应该是数组越界或者字符串索引越界的异常,咱们一步步拆解:
问题1:数组尺寸定义错了
你要存81个数字(对应9×9的矩阵),但你初始化的是int[][] matIn = new int[8][8];——Java里数组的括号数值是「长度」,int[8][8]是8行8列,总共才64个位置,根本装不下81个数字,这肯定会触发数组越界。
修复:改成9×9的数组:
int[][] matIn = new int[9][9];
问题2:循环边界踩坑了
你的循环条件是row <=8和col <=8,如果数组是int[8][8],合法索引只能到7(数组从0开始计数),循环到8直接就访问了不存在的位置,抛出ArrayIndexOutOfBoundsException。
要是你把数组改成9×9,这个循环条件其实没问题,但之前数组尺寸错的时候,这个问题会先爆发出来。
问题3:字符串索引计算逻辑完全不对
你用((row+1)*(col+1)-1)来定位字符,这个逻辑根本不符合「按输入顺序填充矩阵」的需求。比如第1行第0列(row=1, col=0),按你的计算是(2*1)-1=1,但实际上这个位置对应的应该是字符串的第9个字符(准确说:第0行是字符串的0-8位,第1行是9-17位,所以第row行第col列的字符索引应该是row*9 + col)。
原来的计算方式会导致大量位置取到重复字符,甚至超出字符串范围(虽然最后一个位置row=8, col=8的计算是对的,但中间全错了)。
修复:把索引计算改成row*9 + col,然后取单个字符:
matIn[row][col] = Integer.parseInt(rawIn.substring(row*9 + col, row*9 + col + 1));
修复后的完整代码
Scanner scan = new Scanner(System.in); String rawIn = scan.nextLine(); // 不用额外new String(),直接用返回值就行 // 加个输入校验更稳妥 if (rawIn.length() != 81) { System.out.println("请输入恰好81位数字的字符串!"); scan.close(); return; } int[][] matIn = new int[9][9]; for (int row = 0; row < 9; row++) { // 用row<9比row<=8更直观,效果一致 for (int col = 0; col < 9; col++) { int charIndex = row * 9 + col; matIn[row][col] = Integer.parseInt(rawIn.substring(charIndex, charIndex + 1)); } } scan.close(); // 别忘了关闭Scanner
内容的提问来源于stack exchange,提问作者owutyouiee
相关产品推荐
相关产品推荐

