
在java中,数组是固定大小的数据结构,其索引从0开始,到length - 1结束。例如,一个大小为10的数组,其有效索引范围是0到9。当程序尝试访问或修改索引为10或更大的元素时,就会抛出indexoutofboundsexception。
原始代码中,问题主要出在循环逻辑和索引变量的管理上:
// ... (部分原始代码)
String vectorName[] = new String[10];
int vectorNum[] = new int[10];
// ...
nameQuantity++; // 第一次输入后nameQuantity变为1
while(nameQuantity<11) { // 循环条件允许nameQuantity达到10
// ...
vectorName[nameQuantity] = read.nextLine(); // 当nameQuantity为10时,尝试访问vectorName[10]
// ...
nameQuantity++; // 在循环内部再次递增
}这里存在几个关键问题:
为了避免IndexOutOfBoundsException并提高代码的健壮性,我们应该采用更直观和一致的循环及输入处理策略。核心思想是使用一个单一的计数器变量,它始终表示当前已收集的有效条目数量,并且这个计数器可以直接作为下一个要填充的数组索引。
以下是根据上述优化逻辑重构的Java代码:
立即学习“Java免费学习笔记(深入)”;
import java.util.InputMismatchException;
import java.util.Scanner;
public class DataCollectionTutorial {
public static void main(String[] args) {
Scanner read = new Scanner(System.in);
final int MAX_ENTRIES = 10; // 定义最大条目数
String[] vectorName = new String[MAX_ENTRIES];
int[] vectorNum = new int[MAX_ENTRIES];
int entryCount = 0; // 用于跟踪已收集条目数量,并作为当前索引
System.out.println("开始数据收集(最多可输入 " + MAX_ENTRIES + " 条)。");
// 循环直到达到最大条目数或用户选择结束
while (entryCount < MAX_ENTRIES) {
System.out.println("\n请输入姓名(第 " + (entryCount + 1) + " 条,或留空结束):");
String nameInput = read.nextLine(); // 读取姓名,包括可能存在的空行
// 如果姓名为空,则退出循环
if (nameInput.isEmpty()) {
System.out.println("输入结束。");
break;
}
// 存储姓名
vectorName[entryCount] = nameInput;
// 提示并读取数字
System.out.println("请输入一个1到12之间的数字:");
int numInput;
try {
numInput = read.nextInt(); // 尝试读取整数
} catch (InputMismatchException e) {
// 处理非整数输入
System.out.println("输入无效,请输入一个整数。");
read.nextLine(); // 消费掉错误的输入行
continue; // 跳过当前循环的剩余部分,重新开始当前条目的输入
}
read.nextLine(); // 消费掉nextInt()留下的换行符
// 验证数字范围
if (numInput >= 1 && numInput <= 12) {
vectorNum[entryCount] = numInput; // 存储数字
entryCount++; // 成功存储一对数据后,递增计数器
} else {
System.out.println("数字必须在1到12之间,请重新输入当前条目。");
// 不递增entryCount,以便用户可以重新输入当前条目
}
}
// 打印所有已收集的数据
if (entryCount > 0) {
System.out.println("\n--- 已收集的数据 ---");
for (int i = 0; i < entryCount; i++) {
System.out.println("姓名: " + vectorName[i] + ", 数字: " + vectorNum[i]);
}
} else {
System.out.println("没有数据被收集。");
}
read.close(); // 关闭Scanner资源
}
}通过对循环逻辑、数组索引和用户输入处理的细致管理,我们可以有效地避免IndexOutOfBoundsException,并构建出更稳定、用户体验更好的Java应用程序。关键在于理解数组的0-based索引特性,设计清晰的循环终止条件,并对用户输入进行全面的验证和错误处理。遵循这些最佳实践,将有助于编写出高质量、可维护的代码。
以上就是Java数组与用户输入:迭代、边界管理及健壮性实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号