java.lang.StackOverflowError 但我没有循环播放任何内容

java.lang.StackOverflowError but i'm not looping anything

我有两种方法,一种在主 class 中,一种在 class 中,称为 'DeleteWall'。我正在创建每个 class 的实例,以便我可以访问他们的方法。我已经阅读了 Whosebugs 上的所有帖子,但我没有看到我做错了什么......就像我没有循环它来创建一个新实例一样,据我所知 anyway.I '将突出显示导致错误的行,因为 intellij says.I 也只调用一次演示 .哦,方法 'delNode' 在主要 class 中,因此它的实例 '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);
     }

     }

错误

您在 Main 中有一个 DeleteWall 的实例,在 DeleteWall 中有一个 Main 的实例。现在,当它尝试创建 Main class 时,它需要为字段 DeleteWall ok= new DeleteWall(); 创建一个 DeleteWall 实例,当它尝试这样做时,它需要创建一个DeleteWall 内字段 Main werk = new Main();Main 实例。然后它返回创建 Main 并且你有你的无限循环。

您的 Main class 有一个字段 ok,它是用 DeleteWall 对象初始化的。您的 DeleteWall class 有一个字段 werk,它是用 Main 对象初始化的。

因此,当程序启动时 运行,它会实例化 Main class。由于在实例化class时所有字段都被赋予了默认值,所以这里需要实例化DeleteWallclass,这样才能初始化werk。实例化DeleteWallclass需要实例化Mainclass,这样才能初始化ok。实例化Mainclass需要实例化DeleteWallclass,这样才能初始化werk。实例化DeleteWallclass需要实例化Mainclass,这样才能初始化ok。实例化Mainclass需要实例化DeleteWallclass,这样才能初始化werk。 ...

主要问题减少到

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

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

如果这些 class 中的任何一个被实例化,则必须创建另一个的实例,这反过来将再次创建第一个的 new 实例,依此类推. 整个设计是奇怪,就像声明每个房子总是包含一辆汽车,而每个汽车总是包含一个房子。

解决问题:让 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(...);
        }
    }
    

(还有很多其他的可能性,这在很大程度上取决于程序应该做什么,问题是如何建模的,偏好,...)