在Java中传递参数而不会出现stackoverflow错误
目前我正在努力解决一个小问题,我猜。执行我的主要方法时,我收到一个计算器溢出错误。这是因为 Artist 类在 Language 类中创建了一个实例来访问来自 Artist 类(方法)的一些参数。您对我如何根据当前设置设置构造有任何建议吗?
有五个类相互交互:
第一类是带有主要方法的概览类。她应该创建我的控件类的一个实例并执行方法 control.displayArtist(salary, name):
public class Overview {
private static Control control;
private static String name;
private static int salary;
public static void main (String[]args) {
control = new Control();
control.displayArtist(salary, name);
}
}
第二个类是 Control 类。类 Control 创建类 Language 的实例,并由方法 displayArtist(int salary, String name) 组成。这个方法是在Overview类的main方法中直接调用的:
public class Control {
private Language language;
public Control() {
language = new Language();
}
public void displayArtist(int salary, String name) {
language.displayArtistAndSalary(name, salary);
}
}
Language 类包含所有 println 语句,并且正在创建 Artist 的一个实例,用于方法 displayArtistAndSalary(String name, int salary) 来处理来自 Artist 类的 String 名称和 int 薪水:
public class Language {
private Artist artist;
public Language () {
artist = new Artist();
}
public void specifyArtist() {
System.out.println("Who is the artist? ");
}
public void specifyArtistSalary() {
System.out.println("How much does the artist earn? ");
}
public void displayArtistAndSalary(String name, int salary) {
System.out.println("Artist: " + artist.getName(name));
System.out.println("Salary: " + artist.getSalary(salary));
}
}
基于 InputReader 类的输入:
import java.util.Scanner;
public class InputReader {
Scanner sc;
private Language language;
public InputReader () {
sc = new Scanner(System.in);
language = new Language();
}
public void addArtist(String name) {
language.specifyArtist();
name = sc.nextLine();
}
public void addArtistSalary (int salary) {
language.specifyArtistSalary();
salary = sc.nextInt();
}
}
艺术家类在方法 getName (String name) 和 getSalary(int salary) 中返回姓名和薪水:
public class Artist {
private InputReader inputReader;
public Artist() {
inputReader = new InputReader();
}
public String getName (String name){
inputReader.addArtist(name);
return name;
}
public int getSalary(int salary){
inputReader.addArtistSalary(salary);
return salary;
}
}
回答
无论何时创建 Language 对象,Language 对象都会创建一个 Artist 对象。
每当您创建 Artist 对象时,Artist 对象都会创建一个 InputReader。
无论何时创建 InputReader 对象,InputReader 对象都会创建 Language。
清洗,冲洗,重复。
这就是您的代码失败的原因。
解决方法很简单:停止这样做。
这段代码需要重新设计;“语言”对象代表什么,为什么它会成为艺术家对象?为什么 InputReader 会生成 Language 对象?
一个有用的提示:构造函数可以有参数;也许应该只有一个 InputReader 和一个 Language 实例;在这种情况下,让您的 main 方法创建这些实例,并让 InputReader 构造函数采用一个 Language 对象(这样它就不必new向上了)。然后让 Artist 构造函数也接受要使用的语言,而不是要求它创建它的新实例。