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

Java程序重复输出问题:多次重输信息后重复打印结果

Java程序重复打印结果问题修复

问题描述

我正在编写一个基础Java程序,流程如下:

  • 提示用户输入姓名、Jamb分数、PostUtme分数,计算综合分(aggregate);
  • 输入完成后询问用户信息是否正确,确认则打印结果,否则重新输入。

问题:当用户多次重新输入并最终确认后,会重复打印结果(重新输入N次则打印N次)。

现有代码

Calculate类

import java.util.Scanner;
 
public class Calculate {
 
    private String name;
    private float jamb, postUtme, aggregate;
 
    public Calculate(String name, float jamb, float postUtme, float aggregate) {
        this.name = name;
        this.jamb = jamb;
        this.postUtme = postUtme;
        this.aggregate = aggregate;
    }
 
    Scanner input = new Scanner(System.in);
 
    public void calResult(){
        System.out.println("Enter your name");
        name = input.next();
 
        System.out.println("Enter Jamb score");
        jamb = input.nextInt();
 
        System.out.println("Enter PostUtme score");
        postUtme = input.nextInt();
 
        aggregate = (jamb/8) + (postUtme/2);
 
        confirmDetails();
 
        System.out.println("Dear " + name +  " your aggregate is " +  aggregate);
    }
 
    public void confirmDetails(){
        System.out.println("""
                Correct??
                    \t1 to confirm
                    \t2 to re-enter""");
        int confirmD = input.nextInt();
        if (confirmD == 2){
            calResult();
        }
    }
 
    // getter和setter方法
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public float getJamb() { return jamb; }
    public void setJamb(float jamb) { this.jamb = jamb; }
    public float getPostUtme() { return postUtme; }
    public void setPostUtme(float postUtme) { this.postUtme = postUtme; }
    public float getAggregate() { return aggregate; }
    public void setAggregate(float aggregate) { this.aggregate = aggregate; }
}

Main类

public class Main {
    public static void main(String[] args) {
        Calculate c = new Calculate("PlaceHolderValue", 0, 0, 0);
        c.calResult();
    }
}

当前输出

Enter your name
Daniel
Enter Jamb score
50
Enter PostUtme score
40
Correct??
    1 to confirm
    2 to re-enter
2
Enter your name
Tobi
Enter Jamb score
30
Enter PostUtme score
20
Correct??
    1 to confirm
    2 to re-enter
1
Dear Tobi your aggregate is 13.75
Dear Tobi your aggregate is 13.75

期望输出

Enter your name
Daniel
Enter Jamb score
50
Enter PostUtme score
40
Correct??
    1 to confirm
    2 to re-enter
2
Enter your name
Tobi
Enter Jamb score
30
Enter PostUtme score
20
Correct??
    1 to confirm
    2 to re-enter
1
Dear Tobi your aggregate is 13.75

问题原因

问题出在递归调用的执行流程:当用户选择重新输入(输入2)时,confirmDetails()会调用新的calResult(),而之前的calResult()在调用完confirmDetails()后,会继续执行后续的打印语句。每一次重新输入的递归调用结束后,都会回到上一层calResult()执行打印,导致重复输出。

解决方案

推荐使用循环代替递归,逻辑更直观且避免栈溢出风险,具体修改如下:

修改后的Calculate类

import java.util.Scanner;

public class Calculate {

    private String name;
    private float jamb, postUtme, aggregate;
    Scanner input = new Scanner(System.in);

    public Calculate(String name, float jamb, float postUtme, float aggregate) {
        this.name = name;
        this.jamb = jamb;
        this.postUtme = postUtme;
        this.aggregate = aggregate;
    }

    public void calResult() {
        boolean isConfirmed = false;
        // 循环直到用户确认信息正确
        while (!isConfirmed) {
            System.out.println("Enter your name");
            name = input.next();

            System.out.println("Enter Jamb score");
            jamb = input.nextInt();

            System.out.println("Enter PostUtme score");
            postUtme = input.nextInt();

            aggregate = (jamb / 8) + (postUtme / 2);

            // 调用确认方法,获取用户选择
            isConfirmed = confirmDetails();
        }
        // 确认后仅打印一次结果
        System.out.println("Dear " + name + " your aggregate is " + aggregate);
    }

    public boolean confirmDetails() {
        System.out.println("""
                Correct??
                    \t1 to confirm
                    \t2 to re-enter""");
        int confirmD = input.nextInt();
        if (confirmD == 1) {
            return true;
        } else if (confirmD == 2) {
            return false;
        } else {
            // 处理无效输入,提示重新选择
            System.out.println("无效输入,请输入1或2");
            return confirmDetails();
        }
    }

    // getter和setter方法保持不变
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public float getJamb() { return jamb; }
    public void setJamb(float jamb) { this.jamb = jamb; }
    public float getPostUtme() { return postUtme; }
    public void setPostUtme(float postUtme) { this.postUtme = postUtme; }
    public float getAggregate() { return aggregate; }
    public void setAggregate(float aggregate) { this.aggregate = aggregate; }
}

方案说明

用while循环控制输入流程,通过isConfirmed标记判断是否退出循环。只有当用户确认信息正确(返回true)时,才退出循环并执行一次打印语句,彻底解决重复打印问题。同时增加了无效输入的处理,提升程序健壮性。

递归方式的修复(可选)

如果坚持使用递归,可修改方法逻辑,让confirmDetails()返回是否确认的结果,在calResult()中根据结果决定是否打印:

public void calResult(){
    System.out.println("Enter your name");
    name = input.next();

    System.out.println("Enter Jamb score");
    jamb = input.nextInt();

    System.out.println("Enter PostUtme score");
    postUtme = input.nextInt();

    aggregate = (jamb/8) + (postUtme/2);

    if (confirmDetails()) {
        // 仅当确认时才打印
        System.out.println("Dear " + name +  " your aggregate is " +  aggregate);
    } else {
        // 未确认则重新输入
        calResult();
    }
}

public boolean confirmDetails(){
    System.out.println("""
            Correct??
                \t1 to confirm
                \t2 to re-enter""");
    int confirmD = input.nextInt();
    if (confirmD == 1){
        return true;
    } else if (confirmD == 2){
        return false;
    } else {
        System.out.println("无效输入,请输入1或2");
        return confirmDetails();
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 18:32:11