类构造函数中的stackoverflow错误

请原谅可能是一个非常基本的问题,但我正在编写一个程序来存储员工信息,它可以正常工作,直到它试图在我的员工类中设置信息。 它给出了stackoverflow错误,我无法弄清楚为什么。 谢谢你的帮助。

主要课程:

import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner Input = new Scanner(System.in); System.out.println("Enter the number of employees to enter."); int employeeCount = Input.nextInt(); Input.nextLine(); Employee employee[] = new Employee[employeeCount]; String namesTemp; String streetTemp; String cityTemp; String stateTemp; String zipCodeTemp; String address; String dateOfHireTemp; for(int x = 0; x < employeeCount; x++) { System.out.println("Please enter the name of Employee " + (x + 1)); namesTemp = Input.nextLine(); System.out.println("Please enter the street for Employee " + (x + 1)); streetTemp = Input.nextLine(); System.out.println("Please enter the city of Employee " + (x + 1)); cityTemp = Input.nextLine(); System.out.println("Please enter the state of Employee " + (x + 1)); stateTemp = Input.nextLine(); System.out.println("Please enter the zip code of Employee " + (x + 1)); zipCodeTemp = Input.nextLine(); address = streetTemp + ", " + cityTemp + ", " + stateTemp + ", " + zipCodeTemp; System.out.println("Please enter the date of hire for Employee " + (x + 1)); dateOfHireTemp = Input.nextLine(); System.out.println("The employee ID for employee " + (x + 1) + " is " + (x + 1)); employee[x] = new Employee(x, namesTemp, address, dateOfHireTemp); } } } 

员工类:

 public class Employee { private int employeeID; private Name name; private Address address; private DateOfHire hireDate; public Employee() { } public Employee(int employeeID, String name, String address, String hireDate) { String temp; Name employeeName = new Name(name); this.employeeID = employeeID; } } 

名称类:

 public class Name { public Name name; public Name(String name) { Name employeeName = new Name(name); this.name = employeeName; } } 

StackoverflowExceptions最常见的原因是在不知不觉中有递归,这是发生在这里吗? …

 public Name(String name) { Name employeeName = new Name(name); // **** YIKES!! *** this.name = employeeName; } 

宾果游戏:递归!

这个构造函数将创建一个新的Name对象,其构造函数将创建一个新的Name对象,其构造函数将… …因此,您将无限制地创建新的Name对象,或者直到堆栈内存耗尽。 解决方案:不要这样做。 为String指定名称:

 class Name { String name; // ***** String field! public Name(String name) { this.name = name; // this.name is a String field } 

通常,类用于将数据与function组合在一起。 看起来Name类只是String的包装器而不添加任何function。 在Java职业生涯的这一点上,声明String name;可能更好String name;Employee类中,一起删除Name类。 (请注意,这将消除Hovercraft Full of Eels描述的代码中的错误。)