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"); } } }
修复说明
- 单一Scanner处理输入:用一个Scanner读取所有控制台输入,避免换行符残留问题;将年龄按字符串读取,与文件内容直接比较,规避类型不匹配问题。
- 单一Scanner读取文件:用一个Scanner按4行一组读取学生记录,同时跳过空行,确保记录读取的准确性。
- 处理成绩格式:移除成绩字符串中的
%符号后再转换为数值,避免格式异常。 - 规范异常处理:使用try-with-resources自动关闭文件Scanner,分别处理文件不存在、成绩格式错误的异常场景。
- 完整匹配逻辑:遍历所有记录,找到完全匹配的记录后输出成绩,遍历结束未找到则输出“Student not found”。
内容的提问来源于stack exchange,提问作者JustNeedHelp
相关产品推荐
相关产品推荐

