
在Java中,数组是固定大小的数据结构,其索引从0开始,到长度-1结束。例如,一个大小为10的数组,其有效索引范围是0到9。当尝试访问或修改索引为10或更大的元素时,就会抛出IndexOutOfBoundsException。
原始代码中,vectorName和vectorNum都被声明为大小为10的数组:
String vectorName[] = new String[10]; int vectorNum[] = new int[10];
这意味着它们的最大有效索引是9。
导致IndexOutOfBoundsException的核心问题在于循环条件和索引变量的混淆与误用。在原始代码中,nameQuantity变量在某些情况下被递增到10,然后尝试使用vectorName[nameQuantity]进行赋值:
立即学习“Java免费学习笔记(深入)”;
vectorName[nameQuantity] = read.nextLine(); // 当nameQuantity为10时,此处会抛出异常
当nameQuantity的值达到10时,试图访问vectorName[10]将导致越界。这是典型的“差一错误”(off-by-one error)。此外,原始代码的输入逻辑也较为复杂和混乱:先获取一个姓名,然后进入一个循环,在循环内部先获取数字,再获取姓名。这种嵌套的、非对称的输入流程增加了逻辑的复杂性,容易出错。
为了避免IndexOutOfBoundsException并实现清晰的输入逻辑,我们需要遵循以下原则:
以下是一个优化后的Java代码示例,它遵循上述原则,实现了更健壮的数组填充和输入处理逻辑:
import java.util.InputMismatchException;
import java.util.Scanner;
public class ArrayInputTutorial {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); // 推荐使用更通用的变量名
// 声明固定大小的数组,大小为10
String[] names = new String[10];
int[] numbers = new int[10];
// 使用一个计数器来跟踪实际存储的元素数量
// 同时作为当前可用的数组索引
int currentCount = 0;
System.out.println("--- 数据输入向导 ---");
System.out.println("最多可输入10组姓名和数字。");
System.out.println("在输入姓名时,直接按回车键 (不输入任何字符) 即可结束。");
// 使用for循环来控制最大迭代次数,并利用currentCount作为当前索引
for (int i = 0; i < names.length; i++) { // 循环i从0到9,共10次
System.out.println("\n--- 第 " + (i + 1) + " 组数据 ---");
// 1. 获取姓名
System.out.print("请输入姓名: ");
String nameInput = scanner.nextLine().trim(); // 使用trim()去除首尾空白
if (nameInput.isEmpty()) {
System.out.println("姓名为空,输入结束。");
break; // 退出循环
}
// 存储姓名到当前索引
names[i] = nameInput;
// 2. 获取数字并进行验证
int numInput;
while (true) { // 循环直到获取到有效数字
System.out.print("请输入一个1到12之间的数字: ");
try {
numInput = scanner.nextInt();
// 消费掉nextInt()后留下的换行符,避免影响下一次nextLine()
scanner.nextLine();
if (numInput >= 1 && numInput <= 12) {
numbers[i] = numInput; // 存储数字到当前索引
currentCount++; // 只有当姓名和数字都有效存储后,才增加计数
break; // 退出数字输入循环
} else {
System.out.println("错误:数字必须在1到12之间。请重新输入。");
}
} catch (InputMismatchException e) {
System.out.println("错误:输入无效,请输入一个整数。");
scanner.nextLine(); // 消费掉错误的输入,防止无限循环
}
}
}
System.out.println("\n--- 输入数据汇总 ---");
if (currentCount == 0) {
System.out.println("没有有效数据被输入。");
} else {
// 遍历并打印已存储的有效数据
for (int j = 0; j < currentCount; j++) {
System.out.println("姓名: " + names[j] + ", 数字: " + numbers[j]);
}
}
scanner.close(); // 关闭Scanner资源
}
}在Java中处理固定大小数组和用户输入时,理解数组的0-based索引和循环边界至关重要。通过采用清晰的循环结构、统一的计数器、严格的输入验证以及正确的资源管理,我们可以有效地避免IndexOutOfBoundsException等常见错误,编写出更健壮、更易于维护的代码。当数据量不确定时,考虑使用ArrayList等动态集合类会是更灵活的选择。
以上就是Java中固定大小数组的循环遍历与健壮输入处理的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号