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

CodeHS作业中Scanner预期输入与实际输入不匹配错误求助

CodeHS 9.5.9作业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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 15:00:49