java - 为什么我的程序返回 null,null,0 ,0?

标签 java

我的程序应该将用户提交的信息存储到另一个类中。然后应该执行一个小的计算来确定年龄。最后一部分是在 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/

相关文章:

java - 具有原始字符串的所有不同字符的最小长度子字符串的滑动窗口解决方案

java - 绑定(bind)变量期间的 Oracle UCP 性能问题

java - java并发编程中,读取值时是否需要使用synchronized?

java - 嵌入在Java中的Pig:本地的PigServer-没有错误消息,但不会启动map reduce(Maven吗?)

java - 使用泛型类型的嵌入式泛型

java - Ganymed-ssh - 当 execCommand 需要更多时间时如何设置超时关闭 session

java - 如何比较 JSTL 1.0 中 bean 属性的子字符串?

java - 如何使用Eclipse发布Java创建的Web服务?

java - 将一些 MYSQL 放入命名查询中

java - 如何以相反的顺序打印树状图