Java:使用while循环校验成绩输入时Scanner无法读取输入的问题
Java成绩积分计算器:输入循环失效问题修复
你的代码里有两个关键问题导致Scanner输入循环异常:
1. While循环判断逻辑完全错误
你在循环条件里用了&&(逻辑与),但一个成绩不可能同时等于A、B、C等多个值,所以firstgrade.equalsIgnoreCase("A") && ...的结果永远是false,取反后变成true,导致循环永远执行——看起来像是Scanner读不到输入,实际是程序一直在强制循环要求输入。
正确的逻辑应该是:当成绩不是A/B/C/D/E/S/U中的任意一个时,进入循环。需要把&&换成||(逻辑或),再取反:
while (!(firstgrade.equalsIgnoreCase("A") || firstgrade.equalsIgnoreCase("B") || firstgrade.equalsIgnoreCase("C") || firstgrade.equalsIgnoreCase("D") || firstgrade.equalsIgnoreCase("E") || firstgrade.equalsIgnoreCase("S") || firstgrade.equalsIgnoreCase("U")))
2. 多余的scanner.reset()调用
scanner.reset()会重置Scanner的所有状态,包括清除输入缓存,这完全没必要,反而可能干扰输入读取,直接删掉这一行即可。
优化后的完整代码
另外可以用集合存储合法成绩,让判断更简洁,同时简化switch语句的写法:
import java.util.Arrays; import java.util.HashSet; import java.util.Scanner; import java.util.Set; public class GradeCalculator { public static void main(String[] args) { double firsth2 = 0; Scanner scanner = new Scanner(System.in); // 定义合法成绩集合,统一小写便于判断 Set<String> validGrades = new HashSet<>(Arrays.asList("a", "b", "c", "d", "e", "s", "u")); System.out.println("What did you get for your highest scoring H2 subject?"); String firstgrade = scanner.next().toLowerCase(); // 循环校验输入合法性 while (!validGrades.contains(firstgrade)) { System.out.println("Please enter a real grade"); firstgrade = scanner.next().toLowerCase(); } // 小写输入直接匹配分支,无需重复写大小写 switch (firstgrade) { case "a" -> firsth2 = 20; case "b" -> firsth2 = 17.5; case "c" -> firsth2 = 15; case "d" -> firsth2 = 12.5; case "e" -> firsth2 = 10; case "s" -> firsth2 = 5; case "u" -> firsth2 = 0; } // 输出计算结果 System.out.println("Your score for the highest H2 subject is: " + firsth2); scanner.close(); // 关闭输入资源 } }
代码说明
- 用
HashSet存储合法成绩,contains()方法可以快速判断输入是否合法,代码更简洁易维护 - 把输入转成小写,避免在switch里重复写大小写分支
- 添加
scanner.close(),养成关闭IO资源的好习惯
内容的提问来源于stack exchange,提问作者Kylene
相关产品推荐
相关产品推荐

