gpt4 book ai didi

java - 返回 int 始终为零 + 如何在子方法中使用 Main 方法中的对象

转载 作者:行者123 更新时间:2023-12-01 19:54:23 25 4
gpt4 key购买 nike

我正在尝试为学校编写一个简单的 Java 程序,该程序执行以下操作:

健身房成员(member)资格: “编写代码,输入客户的年龄和月数,并打印每月费率和要收取的总金额。提示用户进行适当的输入,并显示有意义的输出消息。确保月份大于 0,年龄大于 0。”

我的问题是:

  1. custMonths int 总是返回 0,我不知道为什么。
  2. 如果用户提供错误的输入(负数或零),我似乎无法找到一种方法循环回到我的 selectAge 方法的开头。

这是我的 Java 代码:

import java.util.*;

public class GymMembership {
public static void main (String[] args) {
//create test customer (customer0) via the constructor
GymMembership customer0 = new GymMembership(70, 12);
customer0.selectAge(customer0.custAge);
customer0.printCustomer();
customer0.getMonthlyRate(customer0.ageNamed);

//prompt user for two integer inputs to create customer1
Scanner scnr = new Scanner(System.in);
System.out.println("Enter customer age, then number of months for contract: ");
GymMembership customer1 = new GymMembership(scnr.nextInt(), scnr.nextInt());
customer1.selectAge(customer1.custAge);
customer1.printCustomer();
}

//the constructor
GymMembership(int custAge, int custMonths) {
this.custAge = custAge;
this.custMonths = custMonths;
}
//instance variables
private int custAge;
private int custMonths;

int monthlyRate;
int childRate = 15;
int adultRate = 25;
int seniorRate = 20;

String ageNamed;
public String selectAge(int custAge) {
Scanner x = new Scanner(System.in);
int age = custAge;
ageNamed = "badInput";
do {
if (age >= 1 && age <= 18) {
ageNamed = "child";
}
else if (age >= 19 && age <= 64) {
ageNamed = "adult";
}
else if (age > 64 && age <= 120) {
ageNamed = "senior";
}
else {
ageNamed = "badInput";
System.out.println("Age must be a positive number between 1 and 120.");
break;
}
} while(ageNamed.equals("badInput"));
return ageNamed;
}

public int getMonthlyRate(String ageNamed) {
if (ageNamed.equalsIgnoreCase("child")) {
monthlyRate = 15;
} else if (ageNamed.equalsIgnoreCase("adult")) {
monthlyRate = 25;
} else {
monthlyRate = 20;
}
return monthlyRate;
}

public void printCustomer() {
if (ageNamed.equals("badInput") != true) {
System.out.println("The customer is a/an " + ageNamed + " and is " + custAge + " years old.");
System.out.println("The customer is signed up for a " + custMonths + " month contract.");
System.out.println("The monthly rate is " + monthlyRate);
}
else {
selectAge(customer1.custAge); //this is broken since I cannot access customer1 object from this "printCustomer" method.
}
}
}

我意识到我也很可能在这里犯一些糟糕的初学者错误,但不太确定它们是什么。

最佳答案

你似乎把事情过于复杂化了。这里的一些问题包括

  • 您在 GymMembership 类中拥有不属于它的用户 I/O。将其取出并放入其自己的 UI 类或只是 main 方法中。
  • 这包括不在 GymMembership 中使用扫描仪,因为您要基于 System.in 创建多个扫描仪,这是一件危险的事情。将其保留在 main 中。
  • 获取 main 中的输入,然后使用它来创建您的 GymMembership 对象。根据需要重复。
  • 年龄和月份的 I/O 验证也应该放在 main 中。同样,GymMembership 应该只关注简单地保存对象的状态和行为。
  • 或者我想您可以为 GymMembership 提供一个静态 boolean 方法来检查有效的年龄和月份,并在 main 方法中使用它来判断输入的数据是否有效。
  • 当您在 GymMembership 的构造函数中设置年龄时,完全不需要 selectAge 方法。同样,大部分代码应该位于 I/O 部分(主部分)。
  • selectAge(customer1.custAge); 无效必要。您在 GymMembership 类中,当前对象的年龄字段对您直接可见,请使用它。
  • 您的 getMonthlyRate(...) 方法很危险,因为它需要计算一个单独的不必要的字段并将其作为字符串传入,而这个字符串是完全不必要的,这可能会导致你的问题。该类已经知道通过年龄和月份字段计算费率所需的信息 - 摆脱 String 参数并使用类自己的字段。

例如,GymMembership 类可以像这样简单:

public class GymMemb2 {
private int age;
private int months;

public GymMemb2(int age, int months) {
this.age = age;
this.months = months;
}

public int getAge() {
return age;
}

public int getMonths() {
return months;
}

public double getMonthlyRate() {
// calculations using age and months for monthly rate
// return result
}

public String print() {
String text = "age: " + age + ", months: " + months;
// also add monthly rate info
return text;
}

}

然后在 main 方法中,再次创建 new Scanner(System.in),仅执行一次,并使用它来获取输入。在主函数中,您将使用 while 循环来保持循环,直到输入有效的输入,然后创建健身房成员(member)对象。我认为 GymMembership 类中不应该有任何 println,而应该返回可以由 main 打印的字符串(如果需要)。

同样在 main 的末尾,通过调用 .close() 来关闭扫描仪。这只能在程序完全完成获取用户输入的情况下完成,因为一旦关闭它可能无法重新打开。

关于java - 返回 int 始终为零 + 如何在子方法中使用 Main 方法中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50090271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com