Java数字比对代码触发ArrayIndexOutOfBoundsException:1的原因及修复方法
嘿,搞定这个数组越界异常!
异常为啥会出现?
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 这个报错其实很直白:你访问了数组里不存在的索引位置。Java数组的索引是从0开始算的,比如一个长度为1的数组,只有索引0能用,你非要去拿索引1的元素,系统当然会给你报错。
结合你比对数字各位的场景,大概率是这两种情况:
- 你把两个数字转成数组/字符串后,它们的长度不一样(比如一个是两位数,一个是一位数),但你循环的时候用了较长那个的长度当边界,去遍历较短的那个。比如数字12转成数组长度是2,数字3转成数组长度是1,循环到第2次(索引1)时,短数组根本没这个位置,直接炸了。
- 循环条件写错了!比如你用了
i <= 数组长度而不是i < 数组长度,举个例子,数组长度是1的话,i <=1会让i取到0和1,索引1就超出范围了。
怎么修复?看这里!
针对你的需求,我给你整理了一套靠谱的修复思路,还有示例代码:
第一步:统一两个数字的位数
先把两个数字转成字符串,给较短的那个补上前导零,让它们长度一致。这样遍历的时候就不会出现一个数组已经到头了,另一个还在继续的情况。
第二步:把循环条件改对
一定要用i < 数组/字符串长度当循环终止条件,确保索引始终在0到“长度-1”的范围内,别越界。
第三步:优化统计逻辑(避免重复计数)
另外提个小细节:统计“值对但位置错”的情况时,要注意别重复计数(比如两个数字都有多个相同的数字),我在示例代码里加了简单的处理,把已经匹配过的字符替换成星号,避免重复算。
修复后的完整代码
public class NumberCompare { public static void main(String[] args) { int num1 = 123; int num2 = 32; // 比如这个数字比num1短,之前会触发异常 // 转成字符串并补前导零,让两者长度一致 String str1 = String.valueOf(num1); String str2 = String.valueOf(num2); int maxLength = Math.max(str1.length(), str2.length()); // 用格式化补前导零 str1 = String.format("%" + maxLength + "d", num1); str2 = String.format("%" + maxLength + "d", num2); int numOfPositives = 0; int numOfNegatives = 0; // 遍历每一位,索引从0到maxLength-1,绝对不会越界 for (int i = 0; i < maxLength; i++) { char c1 = str1.charAt(i); char c2 = str2.charAt(i); if (c1 == c2) { // 位置和数字都对,加正面计数 numOfPositives++; } else { // 检查当前数字是否在另一个数的其他位置存在 if (str2.contains(String.valueOf(c1))) { numOfNegatives++; // 替换掉已匹配的字符,防止重复统计 str2 = str2.replaceFirst(String.valueOf(c1), "*"); } } } System.out.println("位置和数字都正确的数量:" + numOfPositives); System.out.println("数字正确但位置错误的数量:" + numOfNegatives); } }
额外的小建议
- 以后访问数组或字符串索引前,先瞄一眼长度,确保索引在
0 <= 索引 < 长度范围内。 - 处理不同长度的内容时,先统一长度或者分别处理,别硬凑着遍历。
- 虽然可以用try-catch抓异常,但最好从逻辑上避免它发生,这才是更专业的写法哦。
内容的提问来源于stack exchange,提问作者dkorkmaz
相关产品推荐
相关产品推荐

