【问题标题】:why does this object cause a stack overflow?为什么这个对象会导致堆栈溢出?
【发布时间】:2013-11-29 18:43:26
【问题描述】:

我不确定为什么这会导致堆栈溢出。我知道如果我在没有实例的情况下调用 someMethod 方法,它可以正常工作,但我想知道为什么。 谢谢

class test {
    public static void main(String[] args) {
        test item = new test();
        item.someOtherMethod();
    }

    test item2 = new test();

    void someOtherMethod() {
        item2.someMethod();
    }

    void someMethod() {
      System.out.println("print this");
    }
}

【问题讨论】:

  • 堆栈溢出错误导致 Stack Overflow 上的帖子似乎很合乎逻辑。
  • @skuntsel 在这种情况下很容易找到合适的 SE 发帖!

标签: java stack-overflow


【解决方案1】:

test item2 = new test();

这是您的类test 中的一个实例变量。当您创建test 的实例时,它将创建test 的新实例并分配给item2。但是 test 必须创建一个 test 并将其分配给它的 item2 等等......你会得到无限递归,所以你会很快得到任何堆栈的堆栈溢出

【讨论】:

    【解决方案2】:

    每个 new test() 都在创建另一个测试项2 = new test();进入无限递归(stackoverflowerror)

    【讨论】:

    • 这不是无限循环
    【解决方案3】:

    您已经定义了类测试,使得类测试的每个实例都包含一个新的类测试实例。这是无限递归的经典案例,因此是堆栈溢出的快速路径。

    【讨论】:

      【解决方案4】:

      因为每当您的test 类的新实例被初始化时,在您的类上下文中声明的test item2 = new test(); 会尝试创建另一个实例,这将再次导致通过连续调用构造函数来创建另一个实例。 JAVA 使用堆栈来保存局部变量和部分结果,这在方法调用和返回中起作用。因此堆栈最终会溢出。

      【讨论】:

        【解决方案5】:

        将您的问题分成更小的单元以便更好地理解, 以下几行足以为您提供 StackOverflow。

        class test {
            test item2 = new test();   //LINE 1
        
            public static void main(String[] args) {
                test item = new test();  //LINE 2
            }
        }
        

        第 2 行是入口点,一旦执行第 2 行的“new test()”,它将尝试创建一个类型为 test 的对象,该对象有一个名为“item2”的变量(从第 1 行开始)但要初始化一个参考项目2它必须创建新的类型测试对象,这是一个重复的过程。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-12-20
          • 2011-01-13
          • 1970-01-01
          • 1970-01-01
          • 2018-07-01
          • 2016-02-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多