CodeHS作业中Scanner预期输入与实际输入不匹配错误求助
问题背景
完成CodeHS 9.5.9作业时,出现错误提示:
AssignmentRunner.java: Line 20: Your scanner expected a different input then was given.
相关变量与输入方法均为double类型,后续传入的类也支持接收double参数,Scanner初始化无异常,但无法定位问题。已尝试在第17行后添加input.nextLine()、给Scanner初始化时添加.useLocale(Locale.US),均未解决。老师认为是CodeHS平台故障,但仍需有效的排查方案。
相关代码
AssignmentRunner.java
import java.util.*; public class AssignmentRunner { public static void main(String[] args) { Scanner input = new Scanner(System.in); ArrayList<Assignment> assignments= new ArrayList<Assignment>(); while(true){ System.out.print("Enter the assignment's name (exit to quit): "); String name = input.nextLine(); if(name.equals("exit")) break; System.out.print("Enter the due date: "); String dueDate = input.nextLine(); System.out.print("How many points is assignment worth? "); double totPoints = input.nextDouble(); //No issue. System.out.print("How many points were earned? "); double earnedPoints = input.nextDouble(); //Issue here. input.nextLine(); System.out.print("Is this a (T)est or a (P)roject? "); String assignmentType = input.nextLine(); if(assignmentType.equals("T")) { System.out.print("What type of test is it? "); String testType = input.nextLine(); Assignment a = new Test(name, dueDate, totPoints, earnedPoints, testType); assignments.add(a); } else { System.out.print("Does this project require(true/false) ...\nGroups?"); boolean groups = input.nextBoolean(); input.nextLine(); System.out.print("A presentation? "); boolean presentation = input.nextBoolean(); Assignment b = new Project(name, dueDate, totPoints, earnedPoints, groups, presentation); assignments.add(b); } input.nextLine(); } printSummary(assignments); } // Print due date and score percentage on the assignment public static void printSummary(ArrayList<Assignment> assignments) { for(Assignment assignment : assignments){ System.out.println(assignment.getName() + " - " + (assignment.getEarnedPoints()/assignment.getAvailablePoints()*100)); } } }
Assignment.java
public class Assignment { private String name; private String dueDate; private double availablePoints; private double earnedPoints; public Assignment(String name, String dueDate, double availablePoints, double earnedPoints){ this.name = name; this.dueDate = dueDate; this.availablePoints = availablePoints; this.earnedPoints = earnedPoints; } public String getName(){ return name; } public void setName(String name){ this.name = name; } public String getDueDate(){ return dueDate; } public void setDueDate(String dueDate){ this.dueDate = dueDate; } public double getAvailablePoints(){ return availablePoints; } public void setAvailablePoints(double avPts){ availablePoints = avPts; } public double getEarnedPoints(){ return earnedPoints; } public void setEarnedPoints(double ePnts){ earnedPoints = ePnts; } }
Project.java
public class Project extends Assignment { private boolean groups; private boolean presentation; public Project(String name, String dueDate, double availablePoints, double earnedPoints, boolean hasGroups, boolean hasPresentation){ super(name, dueDate, availablePoints, earnedPoints); groups = hasGroups; presentation = hasPresentation; } public boolean hasGroups(){ return groups; } public void setGroups(boolean x){ groups = x; } public boolean hasPresentation(){ return presentation; } public void setPresentation(boolean x){ presentation = x; } }
Test.java
public class Test extends Assignment { private String testType; public Test(String name, String dueDate, double availablePoints, double earnedPoints, String testType){ super(name, dueDate, availablePoints, earnedPoints); this.testType = testType; } public String getTestType(){ return testType; } public void setTestType(String x){ testType = x; } }
排查方案
统一输入读取逻辑:避免混合使用
nextLine()与nextDouble()/nextBoolean()导致的换行符残留问题。所有输入先通过nextLine()读取整行,再手动转换为对应类型,示例:// 替换原有的nextDouble() System.out.print("How many points is assignment worth? "); String totPointsStr = input.nextLine(); double totPoints = Double.parseDouble(totPointsStr);同理处理
earnedPoints和布尔值输入,彻底规避换行符干扰。强制指定Scanner分隔符:CodeHS测试用例可能存在分隔符兼容问题,初始化Scanner时添加
input.useDelimiter("\\r?\\n");,强制按行读取输入,避免因空格、逗号等分隔符导致的解析异常。移除多余的
input.nextLine():当前代码在else分支结束后有一行额外的input.nextLine(),会导致多读取一行空输入,与平台测试输入序列不匹配,建议删除该行后重新测试。添加输入格式校验:用
try-catch包裹类型转换逻辑,捕获NumberFormatException,确认输入内容是否符合预期,同时定位是输入内容问题还是读取逻辑问题,示例:try { double earnedPoints = Double.parseDouble(earnedPointsStr); } catch (NumberFormatException e) { System.out.println("输入的分数格式错误,请输入数字"); // 可添加重试逻辑 }模拟平台测试输入:手动复制平台提供的测试用例输入,在本地运行代码复现错误。如果本地运行正常,大概率是平台自身问题;如果本地也复现错误,则可聚焦代码逻辑排查。
内容的提问来源于stack exchange,提问作者Sinosco

