【问题标题】:Why do I get Infinite loop(Stackoverflow error) while creating an object in a class with constructor? [duplicate]为什么在使用构造函数的类中创建对象时出现无限循环(Stackoverflow 错误)? [复制]
【发布时间】:2016-08-16 03:31:06
【问题描述】:

这是我的代码:

public class ConstructorsDemo{

    public static void main(String a[]){

        Cons1 c1 = new Cons1();

    }

}

class Cons1{

    Cons1 c = new Cons1();// the error is in this line

    Cons1(){

        //does somwthing

    }
}

所以我在这里得到一个无限循环错误(Stackoverflow)。 但是,如果我注释掉我创建的两个对象中的任何一个,就可以了。

我的代码中的对象 c 是如何导致 Stackoverflow 错误的?

【问题讨论】:

  • 你可以在你的调试器中单步调试代码,看看为什么你的代码是递归的。

标签: java object constructor stack-overflow


【解决方案1】:

让我们看看你的课。

它有一个(空的)构造函数,以及一个与类相同类型的字段。

并且该字段直接就地初始化。

问题是:Java 中有一个well-defined process,它指示如何/何时调用构造函数,以及如何初始化类的字段。而且,成员字段被初始化为调用“new”的一部分。

导致:在主类中调用“new”时,应该创建并初始化一个新的 Cons1 对象。该 Cons1 对象具有该 Cons1 字段。这需要使用 ... 初始化一个新的 Cons1 对象,依此类推。

这就是您在 Java 中创建第一个永无止境的递归的方式。

【讨论】:

    【解决方案2】:

    第一点:这是无限递归,不是无限循环。有很大的不同。使用无限循环有完全正当的理由,而且它们通常不会导致堆栈溢出异常。但是,没有个合法的无限递归用例,使用它总是会导致堆栈溢出异常。 (我想你可能会在一些奇怪的情况下争论无限尾递归,但仍然......)如果你得到一个堆栈溢出异常,它几乎可以肯定无限递归而不是无限循环。

    正如其他人指出的那样,这里的基本问题是,每次您调用“new”时,它都会反过来创建一个新对象,而该对象又会创建一个新对象,依此类推。

    Cons1 c = new Cons1();
    

    【讨论】:

      【解决方案3】:
      Cons1 c = new Cons1();// 
      

      请删除此语句并在任何您要使用它的地方初始化它。代码是递归的。

      【讨论】:

        【解决方案4】:

        你正在递归地创建对象,每次创建对象时,这就是为什么你得到无限循环并且女巫导致堆栈溢出的原因

        【讨论】:

        • 无限递归,不是无限循环。无限循环通常不会导致堆栈溢出异常。
        • 递归具有相同的循环概念,因为它是一个调用重复,直到满足返回条件。每当调用该方法时,都会在堆栈内存中创建一个新块,以便该方法保存本地原始值并引用该方法中的其他对象,这就是导致堆栈溢出的原因
        • 是的,但是无限循环不会以相同的方式增大堆栈,因为一旦从函数调用返回,您可以再次缩小堆栈,并且任何局部变量都可以进行垃圾回收(至少在Java 或 C# 等托管语言)。他在上面的代码中不是这种情况。如果你这样做 while (true) { someMethodCall(a, b, c); } 堆栈将增长以容纳 someMethodCall,然后在 someMethodCall 返回后立即再次缩小,但如果你执行 someMethodCall(a, b, c) { return someMethodCall(a, b, c); } 你只会无限期地增长堆栈。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-31
        • 2019-09-15
        • 1970-01-01
        • 1970-01-01
        • 2013-10-05
        • 2021-07-02
        相关资源
        最近更新 更多