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

Java学生测试结果检索功能异常:始终提示未找到学生

学生成绩检索程序错误排查与修复

代码中的核心错误点

  • 控制台输入处理错误:
    创建多个Scanner读取控制台输入,且调用enterAge.nextInt()后,输入流中残留的换行符会被后续enterGender.nextLine()读取,导致stuGender为空字符串,无法匹配文件中的性别信息。

  • 多Scanner读取文件的致命问题:
    为姓名、年龄、性别、成绩分别创建独立Scanner读取同一文件,四个Scanner的读取指针完全独立,无法同步定位到同一条学生记录,根本不可能匹配到对应信息。

  • 数据类型不匹配:
    stuAge是int类型,从文件读取的searchAge是字符串类型,直接用equals比较时因类型不同永远返回false,直接触发“Student not found”。

  • 首条记录被跳过:
    代码开头执行var searchName = usersName.nextLine();,后续循环又执行searchName = usersName.nextLine();,导致文件第一条学生记录被直接跳过。

  • 成绩格式未处理:
    文件中的成绩带有%符号(如93.0%),直接用nextDouble()读取会抛出格式转换异常,导致程序异常终止。

  • 异常处理逻辑错误:
    catch块中判断!usersName.equals(stuName)完全错误,usersName是Scanner对象,不是字符串,永远不可能与stuName相等。

  • 空行未处理:
    文件中记录间的空行会被读取为空白字符串,干扰记录分组读取,导致内容错位。


修复后的代码

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class StudentScoreSearch {
    public static void main(String[] args) {
        // 用单个Scanner处理所有控制台输入
        Scanner inputScanner = new Scanner(System.in);

        System.out.println("Please enter Student's full name below.");
        String stuName = inputScanner.nextLine().trim();

        System.out.println("Please enter Student's age below.");
        String stuAge = inputScanner.nextLine().trim(); // 按字符串读取,避免类型不匹配问题

        System.out.println("Please enter Student's gender below (Female or Male).");
        String stuGender = inputScanner.nextLine().trim();

        boolean found = false;
        // 使用try-with-resources自动关闭文件Scanner
        try (Scanner fileScanner = new Scanner(new File("Example.txt"))) {
            while (fileScanner.hasNextLine()) {
                // 读取单条记录,跳过空行
                String name = "";
                while (fileScanner.hasNextLine() && name.isEmpty()) {
                    name = fileScanner.nextLine().trim();
                }
                if (!fileScanner.hasNextLine()) break;
                String age = fileScanner.nextLine().trim();
                if (!fileScanner.hasNextLine()) break;
                String gender = fileScanner.nextLine().trim();
                if (!fileScanner.hasNextLine()) break;
                String scoreStr = fileScanner.nextLine().trim();

                // 匹配学生信息
                if (name.equals(stuName) && age.equals(stuAge) && gender.equals(stuGender)) {
                    // 移除成绩中的%符号并转换为数值
                    double score = Double.parseDouble(scoreStr.replace("%", ""));
                    System.out.println("The student " + stuName + "'s score was: " + score + "%");
                    found = true;
                    break;
                }
            }
        } catch (FileNotFoundException e) {
            System.out.println("Error: File not found.");
            return;
        } catch (NumberFormatException e) {
            System.out.println("Error: Invalid score format.");
            return;
        }

        if (!found) {
            System.out.println("Student not found");
        }
    }
}

修复说明

  1. 单一Scanner处理输入:用一个Scanner读取所有控制台输入,避免换行符残留问题;将年龄按字符串读取,与文件内容直接比较,规避类型不匹配问题。
  2. 单一Scanner读取文件:用一个Scanner按4行一组读取学生记录,同时跳过空行,确保记录读取的准确性。
  3. 处理成绩格式:移除成绩字符串中的%符号后再转换为数值,避免格式异常。
  4. 规范异常处理:使用try-with-resources自动关闭文件Scanner,分别处理文件不存在、成绩格式错误的异常场景。
  5. 完整匹配逻辑:遍历所有记录,找到完全匹配的记录后输出成绩,遍历结束未找到则输出“Student not found”。

内容的提问来源于stack exchange,提问作者JustNeedHelp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 00:45:22