我正在编写一个基本的Java程序,它会提示用户输入详细资料,输入详细资料后,它会询问用户输入的资料是否正确,如果正确,用户的详细资料会被打印出来,如果不正确,用户需要重新输入详细资料。
现在的问题是,如果用户第二次输入它的详细信息,他们是好的,我得到2打印语句,旧的加新的,如果他们输入它N次,我得到和N次打印语句。
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();
}
}
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;
}
}
主要类别:
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
4条答案
按热度按时间bbmckpt71#
以下是您的问题的最小可重现示例:
如果我输入"false",第二次输入"true",它会给我
作为输出。
如果只需要一次,请将print语句移到调用方法:
这将仅在该方法的原始执行完成后打印。
wpx232ag2#
confirmDetails()
方法正在调用calResult()
,这将导致额外的输出。每次调用calResult()
时,您将有一行输出。由于confirmDetails()
由calResult()
调用,并且它本身可能调用calResult()
,因此您将生成额外的输出行。你需要稍微重新组织你的代码。限制每个方法的责任是有帮助的。考虑为每个操作编写方法,并且你的入口点管理控制流。例如。
gupuwyp23#
它执行了两次,因为
confirmDetails();
是从同一个calResult()
调用的,在confirmDetails();
被调用后,你要打印这个值,所以一旦第一次调用被执行,控制流就会回到第一次调用,并执行剩下的代码,也就是再次打印这个值。建议将确认调用移为主类。
这是我写的一个例子,输入来自主类本身,但这会给予你一个更好的想法。
主类
pkwftd7m4#
下面的代码只是使用Scanner.nextLine(),并使用String.matches()方法和小Regular Expressions验证所有用户输入。
confirmDetails()
方法实际上被重写以返回布尔值(true表示确认,false表示重写)。"-?\\d+"
输入是否匹配有符号或无符号整数值的字符串表示;"[12]"
输入是否与1
或2
的无符号整数值的字符串表示形式匹配。