You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java多线程项目类初始化无限递归栈溢出问题求助

问题根因(栈溢出)

所有业务类(Counter/Clicker/各类升级类)错误继承Game类,触发构造递归:

  • 实例化Game时,构造函数中会创建PerClickUpgrade等子类实例
  • 子类构造会默认调用父类Game的无参构造,再次进入Game初始化逻辑,循环往复直到栈溢出
修复方案
  • 删除非必要继承:不要让升级类、线程任务类继承Game,改为持有Game实例的引用共享全局状态:
    例如PerClickUpgrade的构造新增Game game入参,需要操作total/perClick等属性时直接访问game.total即可。线程类Counter和Clicker同理,构造传入Game实例,不要继承Game。
  • 补全缺失初始化逻辑:代码中totalDisplay、clickArea仅做了声明,未实例化就调用add/setText方法,运行会触发空指针异常,需要在Game构造中先实例化对应对象再使用。
通用优化建议
  • Swing线程安全修复:Swing所有UI操作必须在事件调度线程执行,当前Counter子线程直接修改totalDisplay文本会引发界面卡顿、渲染异常,修改UI的代码需要用SwingUtilities.invokeLater(() -> { 你的UI操作代码 })包裹。
  • 多线程共享变量同步:total、perSec、perClick等属性被多个线程同时读写,没有同步机制会出现可见性、原子性问题,建议给这些属性加volatile修饰,或者改用AtomicInteger等原子类保证线程安全。
  • 消除重复代码:四个升级类的属性、update/buy逻辑高度重合,可以抽公共抽象父类BaseUpgrade,通用逻辑放在父类实现,不同升级类型仅实现各自的属性赋值和购买后特殊逻辑即可,减少冗余代码。
  • 升级逻辑优化:当前切换页码重复写了三套switch逻辑,可以把所有升级按页码存在二维数组中,切换页码时直接遍历对应数组下标调用update方法,不需要硬编码每个升级的调用逻辑。

内容的提问来源于stack exchange,提问作者Elijah Zimmerman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 16:24:05