为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

江户川乱折腾 2023-03-23 14:20:05
我有两种方法,一种在主类中,一种在名为“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);     }     }
查看完整描述

3 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

主要问题减少到


public class Main {

    DeleteWall ok = new DeleteWall();

}


public class DeleteWall  {

    Main werk = new Main();

}

如果这些类中的任何一个被实例化,则必须创建另一个的实例,这又将再次创建第一个的新实例,依此类推。整个设计很奇怪,就像声明每个 House 总是包含一个 Car,而每个 Car 总是包含一个 House。


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

    }

}

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


查看完整回答
反对 回复 2023-03-23
?
绝地无双

TA贡献1946条经验 获得超4个赞

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



查看完整回答
反对 回复 2023-03-23
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

您的班级有一个用对象初始化的Main字段。您的班级有一个用对象初始化的字段。okDeleteWallDeleteWallwerkMain

因此,当程序开始运行时,它会实例化该类Main。由于在实例化类时所有字段都被赋予了默认值,所以这就需要实例化类DeleteWall,这样werk才能初始化。实例化DeleteWall类需要先实例化Main类,这样ok才能初始化。实例化Main类需要先实例化DeleteWall类,这样werk才能初始化。实例化DeleteWall类需要先实例化Main类,这样ok才能初始化。实例化Main类需要先实例化DeleteWall类,这样werk才能初始化。...


查看完整回答
反对 回复 2023-03-23
  • 3 回答
  • 0 关注
  • 111 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信