初始化新对象时的StackOverflow

时间:2015-09-03 08:35:00

标签: java stack-overflow

我不知道为什么会发生这种情况,它似乎是在创建新对象和初始化它之间的一个恒定循环

public class App {

Character hero = new Character();
charCreation charCreation = new charCreation();

public static void main(String [] args){
    App app = new App();
    app.run();
}
    void run(){
        charCreation.charCreate();

    }




}

所以这里App创建了一个新的charCreation对象,就是这个

import java.util.Scanner;

class charCreation extends App {

Scanner skan = new Scanner(System.in);

protected  void charCreate(){

......

这是错误

  

线程中的异常" main" java.lang.StackOverflowError

     

在charCreation。(charCreation.java:3)

     

在App。(App.java:5)

     

在charCreation。(charCreation.java:3)

     

在App。(App.java:5)

     

...

它继续下去

4 个答案:

答案 0 :(得分:4)

当您创建CharCreation的实例(为您修复CamelCase)时,它还将初始化从其超类App继承的所有内容(调用超类构造函数,初始化所有实例字段等)。其中一部分是创建CharCreation的另一个实例(以及Character的实例)。

无限循环。

也许您要从App中删除该实例字段,并将其变为run中的局部变量。

答案 1 :(得分:2)

charCreation类扩展App所以要创建它需要调用超类(App)的构造函数。要构造App超类,App的字段需要进行构造,包括new charCreation() - 因此它会循环。

您需要从创建charCreation实例中分离新App对象的创建。

答案 2 :(得分:1)

您有一个App类,其字段为CharCreation

CharCreation扩展了App,因此在初始化CharCreation对象时,它会初始化字段charCreation。因此,当charCreation字段初始化时,它将初始化一个新的CharCreation对象,依此类推。

这基本上是一个你必须解决的设计问题,我认为你CharCreation课程不应该扩展App课程,charCreate应该返回Character

public class App {
    Character hero = new Character();
    CharCreation charCreation = new charCreation();

    void run(){
        hero = charCreation.charCreate();

    }
}

public class CharCreation {
   public Character charCreate() {
       /* creates and returns the hero */
   }
}

旁注:

  • 始终使用第一个大写字母命名您的类,以匹配java惯例,CharCreation而不是charCreation
  • 不要使用Character命名一个类,它是已经存在于JDK中的类(char的对象)。

答案 3 :(得分:0)

循环对象创建导致堆栈溢出。

  1. App对象创建charCreation实例对象

  2. charCreation对象也将创建App Object,因为它是超类。[超类对象在子节点之前实例化]

  3. 找到循环,继续...直到堆栈溢出。