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
相关产品推荐
相关产品推荐

