Java 为什么我的程序返回null,null,0,0?
我的程序应该将用户提交的信息存储到另一个类中。然后,它应该执行一个小的计算来确定年龄。最后一部分是在驱动程序中创建二级类的实例,然后使用toString打印出所有信息。每次我的结果都是null,null,0,0。我做错了什么Java 为什么我的程序返回null,null,0,0?,java,Java,我的程序应该将用户提交的信息存储到另一个类中。然后,它应该执行一个小的计算来确定年龄。最后一部分是在驱动程序中创建二级类的实例,然后使用toString打印出所有信息。每次我的结果都是null,null,0,0。我做错了什么 public class CustomerInfoProgram { public static Scanner scan = new Scanner(System.in); public static String firstName; publ
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();
}
}
这仅在初始化字段时设置CustomerInfoProgram.name
的值,即在加载Customer
类时设置一次-在更新CustomerInfoProgram.name
时不更新
调用new Customer()
时(最晚)会加载Customer
类,这发生在您运行任何方法来设置CustomerInfoProgram.name
的值之前,因此当您尝试使用name
时,该类为空
如果要使用CustomerInfoProgram.name
的当前值,只需直接引用该字段即可。或者,您可以添加一个getter,该getter将返回其当前值:
public static String getName() {
return CustomerInfoProgram.name;
}
然后调用getter代替name
:
allInfo = (getName() + " " + ...
(与其他字段完全相同)
您还将从
toString()
方法中获得stackoverflowerrror
:
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().
请参阅@Andy的答案以了解问题的原因 通常的方法是在创建
Customer
对象之前收集要存储在该对象中的值,然后使用非默认构造函数调用。部分示例可能如下所示:
// get individual values here
getCustomerName();
getPhone();
// etcetera
Customer in = new Customer(name, phone, address, dob);
其余部分留给读者作为练习。作为静态属性,两个类中的初始化只需一次。因此,从用户那里获得输入后,这些值不会设置为属性。因此为空。第一个错误是所有字段都是静态的。这很奇怪。这使它们成为类字段而不是实例字段。是的,这是一个评估的时机和价值问题的类型。当指定名称时,它将获得一个引用的“副本”,该引用指向当时存储在源中的实际字符串。更改源,更改源的引用,而不是目标的引用。@Andy Turner谢谢!我现在让它工作了,但它打印了100次结果……不知道为什么会这样。@Andy Turner感谢您的帮助。它现在运转得很好。
// get individual values here
getCustomerName();
getPhone();
// etcetera
Customer in = new Customer(name, phone, address, dob);