Java 为什么我的程序返回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

我的程序应该将用户提交的信息存储到另一个类中。然后,它应该执行一个小的计算来确定年龄。最后一部分是在驱动程序中创建二级类的实例,然后使用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();
    }
}
这仅在初始化字段时设置
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);