
本文详解如何正确读取用户输入的整数数组,遍历判断每个元素的奇偶性,并将奇数、偶数分别存入独立数组——重点解决初学者常见的变量作用域、方法误用、数组不可调用add()等编译错误。
在Java中,数组是固定长度的静态容器,不支持add()方法(该方法属于ArrayList等集合类),也不能跨作用域直接访问局部变量(如main()中声明的oddarray在类外方法中不可见)。原代码中出现的numOfVal cannot be resolved、cannot invoke add(int) on the array type int[]等错误,根源在于混淆了基本数组与动态集合的使用方式,且未合理管理变量生命周期与作用域。
下面是一个健壮、可运行、带完整输入校验的专业实现方案:
✅ 核心设计思路
- 使用Scanner统一管理标准输入,避免重复创建与过早关闭;
- 用List
暂存奇偶元素(自动扩容,规避预估长度难题); - 输入阶段严格校验:非数字、空输入、超出int范围均提示重试;
- 最后通过stream().mapToInt(...).toArray()高效转为int[];
- 所有逻辑封装在实例方法中,避免静态污染,提升可维护性。
✅ 完整可运行代码
import java.util.*;
public class CountEvenOddArray {
private final String LS = System.lineSeparator();
private int[] mainArray;
public static void main(String[] args) {
new CountEvenOddArray().startApp(args);
}
private void startApp(String[] args) {
Scanner sc = new Scanner(System.in);
// 步骤1:获取数组长度(带校验)
String inputSize = "";
while (inputSize.isEmpty()) {
System.out.print("Enter number of elements you want to store (or 'q' to quit): -> ");
inputSize = sc.nextLine().trim();
if (inputSize.equalsIgnoreCase("q")) {
System.out.println("Quitting - Bye Bye");
return;
}
if (!isInteger(inputSize)) {
System.out.println("Invalid entry! (" + inputSize + ") Try again..." + LS);
inputSize = "";
}
}
int size = Integer.parseInt(inputSize);
mainArray = new int[size];
// 步骤2:逐个录入元素(带校验)
System.out.println("\nEnter the elements of the array ('q' to quit):");
for (int i = 0; i < size; i++) {
String elemStr = "";
while (elemStr.isEmpty()) {
System.out.print("Enter Element #" + (i + 1) + ": -> ");
elemStr = sc.nextLine().trim();
if (elemStr.equalsIgnoreCase("q")) {
System.out.println("Quitting - Bye Bye");
return;
}
if (!isInteger(elemStr)) {
System.out.println("Invalid entry! (" + elemStr + ") Try again..." + LS);
elemStr = "";
}
}
mainArray[i] = Integer.parseInt(elemStr);
}
// 步骤3:分离奇偶数 → 使用ArrayList动态收集
List oddList = new ArrayList<>();
List evenList = new ArrayList<>();
evenOdds(oddList, evenList);
// 步骤4:转换为int[]并输出
int[] oddArray = oddList.stream().mapToInt(Integer::intValue).toArray();
int[] evenArray = evenList.stream().mapToInt(Integer::intValue).toArray();
System.out.println("\n" + oddArray.length + " odd elements: " + Arrays.toString(oddArray));
System.out.println(evenArray.length + " even elements: " + Arrays.toString(evenArray));
}
private void evenOdds(List odd, List even) {
for (int value : mainArray) {
if (value % 2 == 0) {
even.add(value);
} else {
odd.add(value);
}
}
}
// 健壮的整数校验(支持负数 & 边界检查)
private boolean isInteger(String str) {
if (str == null || str.trim().isEmpty()) return false;
try {
Integer.parseInt(str); // 自动处理符号与溢出
return true;
} catch (NumberFormatException e) {
return false;
}
}
} ⚠️ 关键注意事项
-
不要用int[]直接调用add():数组无此方法,改用ArrayList
; - 变量作用域必须清晰:oddarray/evenarray若在main()中定义,则EvenOdds()方法内无法访问;应通过参数传递或提升为成员变量(本例采用传参更安全);
- 避免硬编码数组长度(如new int[100]):用户输入长度未知,易造成空间浪费或越界;
- 输入校验不可省略:nextInt()遇非数字会卡死,nextLine()配合trim()+正则/异常捕获更可靠;
- Scanner无需手动关闭:JVM退出时自动释放资源;若提前关闭,后续nextLine()将抛IllegalStateException。
运行示例:
Enter number of elements you want to store (or 'q' to quit): -> 5
Enter the elements of the array ('q' to quit):
Enter Element #1: -> 1
Enter Element #2: -> 3
Enter Element #3: -> 2
Enter Element #4: -> 5
Enter Element #5: -> 4
3 odd elements: [1, 3, 5]
2 even elements: [2, 4]此方案兼顾健壮性、可读性与工程实践规范,适合教学与实际项目复用。
立即学习“Java免费学习笔记(深入)”;










