【问题标题】:I get a StackOverflow Error when I refrence two classes. Why?引用两个类时出现 StackOverflow 错误。为什么?
【发布时间】:2014-09-23 21:00:52
【问题描述】:

我很抱歉标题不好,但我不确定我的问题叫什么。 (如果可以的话,请在答案中告诉我)我有两个课程要与之互动。 “设置”类有我在“开始”类中需要的变量,反之亦然。我尝试通过以下方式在“开始”类中扩展“设置”类:

public class Begin extends Setup {

需要注意的是,我确实以这种方式引用了“Setup”类中的“Begin”类:

Begin b = new Begin();

我还尝试在每个相应的类中引用“设置”和“开始”类。这没有帮助。我在两个类中都收到了“java.lang.StackOverflowError”错误。我在引用其他类的地方得到错误。 ('Begin' 中的错误:'Setup s = new Setup();''Setup' 中的错误:'Begin b = new Begin();')

我不知道为什么会出现此错误,也不知道正确调用了什么“引用”类。如果这是重复的,我很抱歉。如果是,请将我链接到该页面。如果没有,请让我知道我可以做些什么来让我的程序再次正常工作。我在本主题中提到的代码和类只是示例。他们不是我正在使用的课程。我认为注意到我正在使用 JFrame 可能会有所帮助。我只是将一个类扩展到 JFrame,但是这两个类都在使用 JFrame。我在没有扩展 JFrame 的类中创建了一个新的 JFrame。如果您无法给出您认为会有所帮助的答案,我会将代码发布到我的两个课程中。 提前致谢! ~兰恩

编辑:谢谢大家!我真的很高兴你能够帮助我解决我给出的例子。再次感谢!

【问题讨论】:

  • 你得到这个是因为你有一个无限递归。
  • 没有看到你的代码,这只能是一个疯狂的猜测,但由于你似乎在基类中使用子类,听起来很可能,你触发了一个无限递归循环方法是相互定义的。
  • 如果您调用创建Begin 的新实例,它将调用new Setup(),该实例将调用new Begin(),并且将调用new Setup() 等。而不是尝试解决该问题,您应该考虑重构这两个类,使它们不相互依赖。
  • 我假设,你执行 Begin b = new Begin();在安装程序的构造函数中。现在,当您创建一个新的 Begin 对象 (new Begin()) 时,会调用 Setup 的构造函数,它会调用“new Begin()”,它会调用 Setup 的构造函数,...
  • 如果您发布更多相关代码,我们可以提供更明智且可能更好的答案。

标签: java swing class jframe


【解决方案1】:

你已经进行了无限递归。

  • 开始扩展设置,
  • 所以Begin的构造函数必须调用Setup的构造函数,并初始化它的superSetup属性
  • 并且安装程序在内部创建另一个开始实例
  • 这将初始化另一个超级设置实例
  • 创建另一个开始实例
  • 这将初始化另一个超级设置实例
  • 创建另一个开始实例
  • 这将初始化另一个超级设置实例
  • 创建另一个开始实例
  • ...等等,直到内存不足

不要那样做。您需要更改程序的整个结构,因为超类不应该知道它的子类,更不用说它的实例了。我敢打赌,Begin 不应该扩展 Setup,这就是我要开始的地方。其实这种情况:

“Setup”类在“Begin”类中有我需要的变量,反之亦然。

不是通过继承解决,而是通过组合解决。比如……

public class Begin {
  private Setup setup;

  public void setSetup(Setup setup) {
     this.setup = setup;
  }

而且也许还有

public class Setup {
  private Begin begin;

  public void setBegin(Begin begin) {
    this.begin = begin;
  }

然后在别处:

Begin begin = new Begin();
Setup setup = new Setup();

begin.setSetup(setup);
setup.setBegin(begin);

还有其他注入依赖项的方法,具体情况取决于您的需要,因此不要将此视为信条,不要为此使用继承。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    相关资源
    最近更新 更多