【问题标题】:Java - Stack Overflow Error From Opposite Class References [closed]Java - 来自相反类引用的堆栈溢出错误[关闭]
【发布时间】:2013-08-14 21:50:43
【问题描述】:

我遇到了一个 Java 程序引发堆栈溢出错误的问题,我确定该问题与两个类文件相互引用有关。例如,在第一类中,有一行二二 = new two();,而在二类中,有一行一一 = new one();。我需要这些类能够共享方法,这是我可以做我想做的事情的唯一方法。我怎样才能让这两个类相互引用而不会导致堆栈溢出问题的递归?

【问题讨论】:

    标签: java class compiler-errors stack-overflow


    【解决方案1】:

    我猜你正在做这样的事情:

    class A {
      private B b = new B();
    
    }
    
    class B {
      private A a = new A();
    
    }
    

    当你这样做时,A 创建一个新的 B 实例,然后创建一个新的 A 实例,然后创建一个新的 B 实例,然后创建一个新的 A 实例,然后创建一个新的 B 实例,然后创建一个新的 B 实例A 实例然后创建一个新的 B 实例,它.​​...

    这会导致递归噩梦。

    解决方案:不要递归地创建新对象。而是通过 setter 方法将一个对象的引用传递给另一个对象。比如……

    class A {
      private B b;
    
      public void setB(B b) {
        this.b = b;
      } 
    }
    
    class B {
      private A a;
    
      public void setA(A a) {
        this.a = a;
      } 
    }
    

    主要代码

    public static void main(String[] args) {
       A a = new A();
       B b = new B();
    
       b.setA(a);
       a.setB(b);
    }
    

    或者更好的是,使用依赖注入,例如 Guice 可以做到的(虽然我不确定你是否可以使用这个工具来创建相互引用的对象)。请确保不要使用您的 a 或 b 变量而不先检查以确保它们不为空。

    顺便说一句,您的程序设计将导致 A 类和 B 类的紧密耦合,您应该考虑使用设计模式来减少这种耦合,例如观察者模式。


    编辑
    你说:

    我不明白这段代码的作用。您能否为我评论一下,以便我更好地理解它?我将如何使用其他类的方法使用此代码?

    第一段代码是我认为你目前正在做的(我不确定,因为你没有显示代码),根据我的笔记,这将导致代码永远运行,直到堆栈溢出发生。我的第二段代码删除了每个类中创建另一个类的实例的代码。相反,它具有设置类引用的 setter 方法。如果您不熟悉 getter 和 setter 方法(也称为 mutator 和 accessor 方法),我强烈建议您查找并查看有关该主题的教程,因为它们在 Java 中被大量使用。但简而言之,A 类有一个方法setB(B b),它允许外部类将完全创建的 B 对象传递给您的 A 对象。因此,它不是 A 创建一个 new B 对象,而是让外部类传入一个 已经制作的 B 对象,这样您就不会重复出现。 B类代码也一样。

    【讨论】:

    • 我不明白这段代码的作用。您能否为我评论一下,以便我更好地理解它?我将如何使用此代码使用其他类的方法?
    • @PWF:见编辑回答。请阅读教程中的 setter 和 getter 方法。
    • 好的,我阅读了一些关于 getter 和 setter 方法的内容,我相信我明白你现在在做什么,但是还有一个我不知道的问题:'this' 是什么意思是?在我得到那个之后,我应该很高兴,如果我可以让我的代码正常工作,我会将它标记为已接受。
    • 我也认为你的方法有错误,因为我在尝试将它们用作公共 void 时出错,我尝试将它们更改为 void,虽然它适用于打印线之类的东西, GUI交互等其他事情都搞砸了。
    • @PWF:如果有错误,可能与您尝试使用我的方法的方式有关,因为作为示例,它们是正确编写的。您所指的 thiscurrent 对象,它拥有您所在的方法或构造函数。这是一个非常基本和关键的概念,您还需要了解更多信息。
    猜你喜欢
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多