在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 构造函数也接受要使用的语言,而不是要求它创建它的新实例。


以上是在Java中传递参数而不会出现stackoverflow错误的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>