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
相关产品推荐
相关产品推荐

