我的程序应该将用户提交的信息存储到另一个类中。然后应该执行一个小的计算来确定年龄。最后一部分是在 Driver 中创建辅助类的实例,然后使用 toString 打印出所有信息。我的结果每次都是 null、null、0 ,0。我做错了什么?
public class CustomerInfoProgram {
public static Scanner scan = new Scanner(System.in);
public static String firstName;
public static String lastName;
public static String address;
public static String phoneNumber;
public static int dob;
public static int currentYear;
public static int age;
public static String name;
public static void main(String[] args) {
Customer in = new Customer();
getCustomerName();
getPhone();
getAddress();
getDOB();
getCurrentYear();
in.toString();
}
public static String getCustomerName() {
System.out.println("What is your first name?");
firstName = scan.nextLine();
System.out.println("What is your last name?");
lastName = scan.nextLine();
name = firstName + " " + lastName;
return name;
}
public static String getAddress() {
System.out.println("What is your address?");
address = scan.nextLine();
return address;
}
public static String getPhone() {
System.out.println("What is your phone number?");
phoneNumber = scan.nextLine();
return phoneNumber;
}
public static int getDOB() {
System.out.println("What year were you born?");
dob = scan.nextInt();
return dob;
}
public static int getCurrentYear() {
System.out.println("What is the current year?");
currentYear = scan.nextInt();
return currentYear;
}
}
中学类:
import java.util.Scanner;
public class Customer {
public static int age;
public static String allInfo;
public static String name = CustomerInfoProgram.name;
public static String address = CustomerInfoProgram.address;
public static String phoneNumber = CustomerInfoProgram.phoneNumber;
public static int dob = CustomerInfoProgram.dob;
public static int currentYear = CustomerInfoProgram.currentYear;
private int getAge() {
age = (currentYear - dob);
return age;
}
public String toString() {
getAge();
allInfo = (name + " " + address + " " + phoneNumber + " " + dob + " " + age);
System.out.println(allInfo);
return toString();
}
}
最佳答案
public static String name = CustomerInfoProgram.name;
这只在字段初始化时设置 CustomerInfoProgram.name
的值,即加载 Customer
类时一次 - 它不会在 时更新CustomerInfoProgram.name
已更新。
Customer
类(最迟)在您调用 new Customer()
时加载,这发生在您运行任何方法来设置 的值之前CustomerInfoProgram.name
,因此当您尝试使用name
时它为空。
如果您想使用CustomerInfoProgram.name
的当前值,只需直接引用该字段即可。或者,您可以添加一个 getter,它将返回其当前值:
public static String getName() {
return CustomerInfoProgram.name;
}
然后调用 getter 来代替 name
:
allInfo = (getName() + " " + ...
(其他字段完全相同)。
<小时/>您还将从 toString()
方法获得一个 StackOverflowError
:
public String toString() {
getAge();
allInfo = (name + " " + address + " " + phoneNumber + " " + dob + " " + age);
System.out.println(allInfo);
return toString();
}
您在 toString()
内部无条件调用 toString()
,因此这将继续调用自身,直到耗尽堆栈空间。
相反,只需返回allInfo
:
public String toString() {
getAge(); // This actually does nothing - do you intend to use it in the return value?
return (name + " " + address + " " + phoneNumber + " " + dob + " " + age);
}
并在主方法中调用System.out.println
:
System.out.println(in); // Implicitly calls toString().
关于java - 为什么我的程序返回 null,null,0 ,0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33816140/