java.lang.StackOverflowError但我没有循环任何东西

时间:2019-07-13 21:50:30

标签: java javafx stack-overflow

我有两种方法在主类中,一种在名为'DeleteWall'的类中。我正在创建每个类的实例,以便可以访问它们的方法。我已经阅读了stackOverflows上的所有文章,但我没有看不到我在做错什么...就像我无论如何都不会循环播放它来建立新实例一样,我将像intellij所说的那样突出显示导致错误的行。我只是一次调用演示 哦,方法“ delNode”在主类中,因此它是“ werk”的实例。

    //Main class
    DeleteWall ok=new DeleteWall(); //error line
    public void demo(){
    System.out.println("running");
    ok.delWalls(30,0,30,30);
    System.out.println("didnt stop");
    }
     //DeleteWall class
     public class DeleteWall  {

     Main werk = new Main(); //error line

     public  void delWalls(int Sx, int Sy, int Ex, int Ey) {


     werk.delNode(Sx, Sy, Ex, Ey);
     }

     }

错误 enter image description here

2 个答案:

答案 0 :(得分:4)

主要问题减少到

public class Main {
    DeleteWall ok = new DeleteWall();
}

public class DeleteWall  {
    Main werk = new Main();
}

如果这些类中的任何一个被实例化,则必须创建另一个类的实例,该实例又将再次创建第一个的 new 实例,依此类推。 整个设计都是 strange ,就像声明每个房屋始终包含一辆汽车,而每辆汽车始终包含一个房屋一样。

解决问题:让DeleteWall接收Main的实例,而不是创建一个新的实例。一些可能性:

  • 在构造函数中

    public class Main {
        DeleteWall ok = new DeleteWall(this);
    }
    
    ////
    
    public class DeleteWall  {
        Main werk;
        public DeleteWall(Main main) {
            werk = main;
        }
    }
    
  • 致电时

    public class Main {
        DeleteWall ok = new DeleteWall();
        public void demo() {
            ok.delWalls(this, 30, 0, 30, 30);
        }
    }
    
    ////
    
    public class DeleteWall  {
        public void delWalls(Main werk, ...) {
            werk.delNodes(...);
        }
    }
    

(还有许多其他可能性,这在很大程度上取决于程序应该执行的操作,问题的建模方式,偏好等等)

答案 1 :(得分:3)

您在DeleteWall中有一个Main的实例,在Main中有一个DeleteWall的实例。现在,当它尝试创建Main类时,将需要为字段DeleteWall创建一个DeleteWall ok= new DeleteWall();实例,而它需要创建一个{{ 1 {}中的Main中的字段Main werk = new Main();。然后返回创建Main,然后就可以进行无限循环了。