当前位置: 首页 > 知识库问答 >
问题:

为什么我得到无限循环(Stackoverflow错误),而创建一个对象在一个类与构造函数?[复制]

苏波涛
2023-03-14

这是我的代码:

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错误?

共有3个答案

呼延承平
2023-03-14
Cons1 c = new Cons1();// 

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

阎嘉荣
2023-03-14

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

正如其他人指出的,这里的基本问题是,每次你调用“新”它,反过来又创建了一个新对象,这个对象又创建了一个新对象,依此类推。

Cons1 c = new Cons1();
卢阳成
2023-03-14

让我们看看你的课。

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

该字段直接初始化到位。

问题是:Java中有一个定义良好的过程,它规定了如何/何时调用构造函数,以及如何初始化类的字段。成员字段是作为调用“new”的一部分初始化的。

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

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

 类似资料:
  • 问题内容: 我已经存储了一个in in 组件。我传递的和为从父到子。然而,如果在父母一些事件,被触发,因此,儿童被执行。 由于造成了无限循环 (因为它触发了子组件内部的setState()) ,所以我放置了条件。但这不能防止错误。 子组件即如下: 父组件即MonthToDate如下: 我想念什么? 另外,在收到in子组件之后,我想基于那个渲染另一个组件。例如component只能处理一种类型的。如

  • 我正在努力解决这个问题1438。绝对差值小于或等于极限的最长连续子阵列。我明白了逻辑,但有一个非常奇怪的问题,我不得不拉扯头发两个多小时。 代码如下:- 您可以看到,当我将一个整数放入每个队列时,代码运行良好,但当我将一个int放入三个队列时,我得到一个TLE。因此,在下面的代码中,如果temp是,则代码通过,但当temp是时,它会给出一个TLE。有人能解释一下发生了什么吗?

  • 这可能是一个愚蠢的问题,但现在请耐心听我说。我有类似于: 如果我在超类中创建一个子类对象,它会进入无限循环,因为我想一旦子类对象被创建,它会不断调用超类构造函数,继续创建子类对象。如果我在main中声明子类对象,我会得到类似“无法从静态上下文引用非静态成员”的内容,因为我的超类对象还没有初始化。所以我无法在main中初始化我的子类对象。 那么,有什么好的方法来处理这个问题呢?

  • 我正在尝试修改类Circle以包含第三个构造函数,用于构造具有两个参数的Circle实例——半径的双精度和颜色的字符串。还修改主类以使用此构造函数构造Circle的实例。我对此有困难,我一直收到从未使用构造函数Circle的消息。请查看代码。

  • C#中定义的结构不能具有无参数构造函数。但是,据我所知,CLR允许使用此类构造函数。有。NET库(请参见UnityEngine.CoreModule(即.NET 3.5)中的Vector3等结构)。 问题是,有没有一种简单的方法可以将无参数构造函数添加到我的。NET程序集(不在其源代码中)?我是不是应该在建立了议会的IL之后再搞砸它?团结在他们的大会上怎么可能做到这一点? UPDATE:实际上,所