Java新手求助:随机数数组拆分奇偶数组时赋值报错排查
问题分析与解决方案:Java数组拆分奇偶元素时的索引越界错误
看起来你踩了一个新手很容易犯的数组索引错误——直接用原数组的遍历索引去操作新数组,导致了ArrayIndexOutOfBoundsException(数组索引越界异常),这就是那两行带感叹号的代码报错的原因。
错误原因详解
举个具体的例子:假设你的原数组tab2有5个元素,其中3个是偶数、2个是奇数。那你创建的tab_E长度是3(最大索引是2),tab_O长度是2(最大索引是1)。当你遍历原数组到第4个元素(索引i=3)时,如果这个元素是偶数,你执行tab_E[3] = tab2[3],但tab_E根本没有索引3的位置,直接就触发了数组越界,程序崩溃。而换成System.out.println时,只是打印内容,不会操作数组索引,所以不会报错。
修复方案
你需要为奇偶数组分别维护一个独立的索引计数器,用来跟踪当前应该把元素放到新数组的哪个位置,而不是直接复用原数组的i。同时我们可以把两次遍历原数组的逻辑合并成一次,提升代码效率:
public void P_N () { int I_E = 0; // 偶数数量 int I_O = 0; // 奇数数量 for (int i = 0; i < tab2.length; i++) { // tab2为随机数数组 if (tab2[i] % 2 == 0) I_E = I_E + 1; else I_O = I_O + 1; } int [] tab_E = new int[I_E]; // 偶数数组 int [] tab_O = new int [I_O]; // 奇数数组 // 新增两个索引计数器,初始为0,跟踪奇偶数组的当前赋值位置 int eIndex = 0; int oIndex = 0; // 合并遍历逻辑,一次遍历完成两个数组的赋值 for (int i = 0; i < tab2.length; i++){ if (tab2[i] % 2 == 0){ tab_E[eIndex++] = tab2[i]; // 赋值后计数器自增,指向下一个空位置 } else { tab_O[oIndex++] = tab2[i]; } } // 打印结果 for (int i = 0; i< tab_E.length; i++) { System.out.println("Even array: " + tab_E[i]); System.out.println("------------------------------------------------"); } for (int i = 0; i< tab_O.length; i++) { System.out.println("Odd array: " + tab_O[i]); } }
关键优化点说明
- 独立索引计数器:
eIndex和oIndex只会在找到对应奇偶元素时才自增,最大值刚好等于对应数组的长度-1,完全不会越界 - 合并遍历:原来的代码需要遍历原数组3次(统计数量+赋值偶数+赋值奇数),现在只需要2次,减少了不必要的循环,效率更高
- 代码简洁性:把奇偶元素的赋值逻辑合并到一个循环里,逻辑更清晰,也减少了重复代码
内容的提问来源于stack exchange,提问作者Piotr Pawlik
相关产品推荐
相关产品推荐

