填充整数数组时触发ArrayIndexOutOfBoundsException问题求助
解决你的ArrayIndexOutOfBoundsException问题
嘿,我看你在尝试用迭代填充整数数组时碰到了数组越界异常,咱们来一步步拆解问题,搞定它!
首先,异常的核心原因:你的steps数组长度是1000001,所以合法索引只能到1000000。但内层循环里mult = current*m这个计算很容易超界——比如当current是1001的时候,m取1001的话,1001*1001=1002001,直接超过了数组的最大索引,这时候访问steps[mult]肯定会炸。而且不止这个情况,哪怕current是500000,m取3的话,500000*3=1500000也超界了,之前的判断没拦住所有风险。
另外你的代码还有个逻辑漏洞:外层循环从i=1001开始,那3到1000的steps值都是初始的0,你后面判断if(steps[i]==0)才赋值,但这些位置根本没被处理过,逻辑完全走不通啊!
修复后的代码示例:
import java.util.Scanner; public class StepCalculator { public static void main(String[] args) { final int MAX_SIZE = 1000001; int[] steps = new int[MAX_SIZE]; // 初始化已知的步数 steps[0] = 0; steps[1] = 1; steps[2] = 2; // 先给所有数赋一个默认步数:通过前一个数+1到达 for (int i = 3; i < MAX_SIZE; i++) { steps[i] = steps[i-1] + 1; } // 遍历每个数,尝试通过乘法的方式更新更小的步数 for (int i = 2; i < MAX_SIZE; i++) { int current = i; // 从m=2开始乘,一旦乘积超数组范围就停止 for (int m = 2; ; m++) { int mult = current * m; if (mult >= MAX_SIZE) { break; // 超范围就别继续算了,避免越界 } int possibleStep = steps[current] + 1; // 如果通过乘法得到的步数比当前记录的更小,就更新 if (possibleStep < steps[mult]) { steps[mult] = possibleStep; } } } Scanner scan = new Scanner(System.in); System.out.print("请输入要查询的数字n: "); int n = scan.nextInt(); if (n >= 0 && n < MAX_SIZE) { System.out.printf("到达数字%d的最少步数是: %d%n", n, steps[n]); } else { System.out.println("输入的数字超出范围啦,请输入0到1000000之间的数"); } scan.close(); } }
修复点说明:
- 彻底避免越界:内层循环从
m=2开始(m=1的话乘积就是current本身,没必要处理),并且一旦计算出的mult超过数组最大索引,直接break终止内层循环,从根源上杜绝越界。 - 补全初始逻辑:先通过循环给3到1000000的所有位置赋默认步数,确保每个位置都有初始值,不会出现未初始化的0干扰判断。
- 优化步数更新:只有当通过乘法得到的新步数比当前记录的步数更小时,才更新数组值,避免无效操作,提升效率。
这样改完之后,不仅解决了数组越界的问题,你的步数计算逻辑也能正常跑起来啦!
内容的提问来源于stack exchange,提问作者Reimu
相关产品推荐
相关产品推荐

