You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:30:47