Java实现int数组返回非空前缀字符串数组的代码报错排查
代码核心错误排查
- 数组越界异常触发:循环的终止条件为
i < numbers.length,当执行到最后一轮循环(i = numbers.length - 1)时,代码会执行seq += ", " + numbers[i + 1],此时访问的数组下标为numbers.length,超出整数数组的最大合法下标范围(最大合法下标为numbers.length - 1)。比如输入为[3,1,4]时,代码会正常把前两个前缀、第三个前缀存入结果数组,随后在最后一次循环的拼接步骤触发ArrayIndexOutOfBoundsException,完全无法正常返回结果。 - 空入参场景直接崩溃:代码初始化阶段直接读取
numbers[0]拼接初始字符串,如果传入的整数数组长度为0,这一行代码就会直接触发数组越界,完全不具备边界兼容能力。 - 冗余无效逻辑:代码中定义的
result变量仅在末尾被赋值为arr后直接返回,没有承担任何数据处理作用,属于无意义的冗余代码。
修正后可直接运行的代码
public static String[] getAllPrefixes(int[] numbers) { int arrLen = numbers.length; String[] result = new String[arrLen]; // 空入参直接返回空结果数组 if (arrLen == 0) { return result; } StringBuilder prefixBuilder = new StringBuilder(); for (int i = 0; i < arrLen; i++) { // 非首元素前增加逗号分隔符 if (i != 0) { prefixBuilder.append(", "); } prefixBuilder.append(numbers[i]); // 把当前拼接完成的前缀包裹中括号存入结果数组 result[i] = "[" + prefixBuilder + "]"; } return result; }
修正逻辑说明
- 移除原有循环末尾拼接下一个元素的逻辑,改为遍历到哪个元素就把该元素拼接到当前前缀字符串中,存值顺序天然和各长度前缀一一对应,从根源上避免循环末尾的越界访问。
- 使用
StringBuilder替代不可变的String做循环内拼接,避免反复创建字符串对象带来的不必要性能损耗。 - 增加空入参的前置判断,避免读取数组首元素时的越界问题。
- 保留清晰的变量命名,去掉冗余的临时变量,简化代码执行流程。
内容的提问来源于stack exchange,提问作者Sina Heidari
相关产品推荐
相关产品推荐

