Java单While循环下实现多输入无效时重复提问的方法(作业答疑)
问题分析与修复方案
嘿,我来帮你搞定这个问题!你的核心问题出在while循环的条件和嵌套逻辑的设计上,咱们一步步拆解:
原代码的问题点
- 循环条件错误:你写的
while (i == 0)意味着只要作业输入正确(i变成1),循环就直接终止了!后面的期中、期末输入只是在第一次循环里顺带着执行了一次,要是输入无效,循环已经结束,自然没法重复询问。 - 嵌套逻辑混乱:你把三个输入的逻辑层层嵌套在一起,导致某个步骤输入无效时,后续的逻辑也跟着乱套,没法单独重复处理当前输入项。
修复后的代码
import java.util.Scanner; public class Lab3 { public static void main(String[] args) { Scanner scan = new Scanner(System.in); double homework = 0; double midterm = 0; double finalGrade = 0; int i = 0; // 循环直到三个成绩都输入正确(i从0到2,完成后i=3退出循环) while (i < 3) { if (i == 0) { System.out.print("Enter your HOMEWORK grade: "); // 先判断输入是否为整数,避免异常 if (scan.hasNextInt()) { homework = scan.nextInt(); if (homework < 0 || homework > 100) { System.out.println("[ERR] Invalid input. A homework grade should be in [0, 100]."); } else { i++; // 输入有效,切换到下一个成绩输入 } } else { System.out.println("[ERR] Please enter an integer value."); scan.next(); // 清除无效输入,防止死循环 } } else if (i == 1) { System.out.print("Enter your MIDTERM EXAM grade: "); if (scan.hasNextInt()) { midterm = scan.nextInt(); if (midterm < 0 || midterm > 100) { System.out.println("[ERR] Invalid input. A midterm grade should be in [0, 100]."); } else { i++; } } else { System.out.println("[ERR] Please enter an integer value."); scan.next(); } } else if (i == 2) { System.out.print("Enter your FINAL EXAM grade: "); if (scan.hasNextInt()) { finalGrade = scan.nextInt(); if (finalGrade < 0 || finalGrade > 200) { System.out.println("[ERR] Invalid input. A FINAL EXAM grade should be in [0, 200]."); } else { i++; // 计算加权总分并输出结果 double totalWeighted = (finalGrade / 200 * 50) + (midterm * 0.25) + (homework * 0.25); System.out.println("[INFO] Student's Weighted Total is " + totalWeighted); System.out.println("[INFO] Student " + (totalWeighted >= 50 ? "PASSED" : "FAILED") + " the class."); } } else { System.out.println("[ERR] Please enter an integer value."); scan.next(); } } } scan.close(); // 关闭Scanner,释放资源 } }
关键改动说明
- 循环条件调整:改成
while (i < 3),这样只要三个成绩还没全部输入正确(i从0到2),循环就会持续运行,直到所有输入都有效。 - 独立输入逻辑:用
i标记当前要处理的输入项,每个i值对应单独的输入逻辑。只有当前输入有效时,才让i递增,进入下一个输入项;如果输入无效,i保持不变,下次循环会再次询问同一个问题。 - 异常输入处理:增加了
hasNextInt()判断,避免用户输入非整数导致程序崩溃,同时用scan.next()清除无效输入,防止死循环。 - 变量初始化:给三个成绩变量设置初始值,避免编译器报错。
- 资源管理:最后关闭
Scanner,养成良好的编程习惯。
这样修改后,每个输入项在无效时都会重复询问,完全符合你的作业要求~
内容的提问来源于stack exchange,提问作者lilmiggle




