Java数组越界异常排查:用数组构建二叉树时出现IndexOutOfBoundsException
问题分析与解决
核心错误原因
报错ArrayIndexOutOfBoundsException: Index 11 out of bounds for length 7明确说明:你代码中实际使用的数组长度为7,但构建二叉树的逻辑尝试访问索引11的位置。而你声明的mainTree数组包含11个元素,这说明代码里的数组初始化与你描述的不一致,或者递归构建时的索引计算逻辑存在错误。
可能场景及修复方案
场景1:数组初始化错误
你可能在实际代码中不小心将数组写成了7个元素,比如:int[] mainTree = {1,2,4,-1,-1,5,-1}; // 仅7个元素,与你描述的11个元素不符检查你的数组声明,确保和你描述的一致,是包含11个元素的版本。
场景2:递归构建逻辑的索引计算错误
用前序遍历序列化数组构建二叉树时,递归函数需要正确维护当前访问的索引。如果你的递归逻辑存在以下问题,就会导致越界:- 使用值传递的索引变量(比如直接传
int类型的index,递归时无法更新外层的索引值,导致重复访问同一位置,最终超出数组长度) - 遇到空节点(
-1)时未递增索引
以下是正确的前序构建逻辑示例(用数组维护索引,实现引用传递):
class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } public class TreeBuilder { public static TreeNode buildTree(int[] arr) { int[] index = {0}; // 用数组维护索引,确保递归时索引能正确更新 return build(arr, index); } private static TreeNode build(int[] arr, int[] index) { // 先判断索引是否越界,或当前节点为空 if (index[0] >= arr.length || arr[index[0]] == -1) { index[0]++; return null; } TreeNode node = new TreeNode(arr[index[0]]); index[0]++; node.left = build(arr, index); node.right = build(arr, index); return node; } public static void main(String[] args) { int[] mainTree = {1,2,4,-1,-1,5,-1,-1,3,-1,-1}; TreeNode root = buildTree(mainTree); } }- 使用值传递的索引变量(比如直接传
验证步骤
- 先打印数组长度,确认运行时数组的实际长度:
System.out.println(mainTree.length);,如果输出为7,说明数组初始化错误,修正即可。 - 如果数组长度确实是11,检查递归构建逻辑中的索引处理,确保索引每次访问后都正确递增,且不会超过数组长度。
内容的提问来源于stack exchange,提问作者Divyanshu Rawat
相关产品推荐
相关产品推荐

