【问题标题】:StackOverflowError whilst creating object创建对象时出现 StackOverflowError
【发布时间】:2019-03-21 08:04:23
【问题描述】:

所以这只是我尝试创建对象的代码的一部分。我添加的只是构造函数的主体。我的代码中可能有其他问题,但我只是想检查这是否是创建艺术家对象的方法。我得到了错误:

Exception in thread "main" java.lang.StackOverflowError 

在 tss.Artist。 (Artist.java:26) 被多次列出。我只是一个困惑的java菜鸟。任何帮助将不胜感激:)

public Artist(String name) {
      Artist artist = new Artist(name);
}

【问题讨论】:

  • 那是无限循环...每次创建对象“艺术家”时,您都会创建一个对象“艺术家”...
  • 你在这里进行无限递归,这就是你得到堆栈溢出的原因。在您的构造函数中,您正在调用相同的构造函数,依此类推,直到您的堆栈已满。
  • 这是在调试器中单步执行代码的最快方法,可以查看代码在做什么以及为什么。
  • @Wufo 它是无限的,但不是循环,而是递归调用
  • @Stultuske 是的,你是对的。这是一个递归调用...

标签: java oop object recursion stack-overflow


【解决方案1】:

只要仔细看看那个方法:

public Artist(String name) {
    Artist artist = new Artist(name);
}

对象的构造函数正在调用自身。你有一个无限循环,StackOverflowError 被抛出。

【讨论】:

  • 好的,是的,这很有意义。谢谢
  • @zzzzzz 没问题,如果您觉得有帮助,请考虑支持/标记为正确;)
【解决方案2】:

你是 recursively calling the constructor 没有 any terminating condition 导致 infinite stack of the constructor call

public Artist(String name) {
    Artist artist = new Artist(name);
}

您的new Artist(name) 将调用构造函数public Artist(String name) 并再次调用new Artist(name),这将继续进行,但方法堆栈已满。

【讨论】:

    【解决方案3】:

    构造函数用于实例化任何对象。当你在你的类中添加一个构造函数[在你的例子中,一个参数化的构造函数],只需将它用于初始化目的。

    public Artist(String name) {
      this.name = name;  // you have private variable called name in your class
     }
    

    如果您在构造函数中实例化对象,它将进入一个永无止境的循环,最终您将遇到 StackOverFlow 错误。

    【讨论】:

      【解决方案4】:

      我看到你在两方面提出问题(代码):创建构造函数和创建类对象。在下一个示例中,我将类放在那里以显示代码的结构。

      //class should look like this ...
      public class Artist {
          String artistName;
          //other attributes
      
          //create constructor
          public Artist(String name){
              this.artistName = name;    
          }
      }
      
      
      //Next two line can be placed in other class 
      //(e.g. 1st line in class containing main function and 2st line in main function)
      //create object/instance of class
      Artist artist = new Artist(name);
      
      //Use create instance of that class
      System.out.println(artist.artistName);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-01
        • 2011-04-10
        • 1970-01-01
        • 1970-01-01
        • 2015-03-20
        相关资源
        最近更新 更多