Java Scanner输入校验异常:填充Double数组的for循环丢失有效输入
问题根源
- 循环逻辑存在核心偏差:原代码的for循环是固定次数执行,每一轮循环无论用户输入的内容是否合法,循环下标
i都会自动自增。如果某一轮输入的圈速不符合范围,这一轮的数组位置会被留空,但已经消耗了一次输入提示机会,最终采集到的有效圈速数量会少于用户指定的总圈数,出现“有效输入被吞”的现象。 - 校验和状态维护逻辑冗余:原代码中合法判断、非法判断的范围完全重叠,没有按照提示规则覆盖0值边界;单独维护的
index变量和数组下标i容易出现状态不同步的问题,进一步加剧数据不一致。
修复方案
- 调整循环驱动逻辑:将固定次数的for循环替换为按有效采集进度驱动的while循环,只有当成功存入一个合法圈速到数组时,才推进采集计数,直到凑够用户指定的总圈数为止。非法输入不会消耗采集配额,程序会停留在当前圈的输入提示,直到用户输入合法值。
- 简化状态维护:不再单独维护圈号计数,已采集的有效圈数+1就是下一次需要提示的圈号,避免多变量不同步的问题。
- 统一边界校验规则:按照提示要求,合法圈速范围为闭区间
[0,60],不符合范围的输入直接触发错误提示,不推进采集进度。
修正后核心代码
import java.util.Scanner; public class JK_FINALPRAC1 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("Time-Trial Statistics Program\n"); System.out.println("This program will ask you to input split-times for each lap or length of a race. The "); System.out.println("program will then calculate some basic statistics from the split-times.\n"); System.out.print("Enter the number of laps or lengths in the race: "); int arraySize = sc.nextInt(); Double[] lapArray = new Double[arraySize]; System.out.println("Now input the elapsed time (split time) in seconds for each lap/length of the race."); int collectedCount = 0; while (collectedCount < arraySize) { System.out.print("Time for lap or length #" + (collectedCount + 1) + ": "); double currentNum = sc.nextDouble(); if (currentNum >= 0 && currentNum <= 60) { lapArray[collectedCount] = currentNum; collectedCount++; } else { System.out.println("Invalid input! Time must be between 0 and 60."); } } sc.close(); } }
调整后逻辑下,程序会始终提示用户输入对应序号的圈速,直到收集到足够的合法值才会退出循环,不会出现数组空值、有效数据被吞的问题。
内容的提问来源于stack exchange,提问作者JK3
相关产品推荐
相关产品推荐

