You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 23:33:13