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

如何修复Java实现MoveStrategy接口用Optional时出现的StackOverflowError?

栈溢出原因

你编写的StraightLineMovement.move()方法存在无终止条件的无限递归调用,是触发StackOverflowError的核心原因:

  • 方法内部创建了新的StraightLineMovement实例后,再次调用了实例的move()方法,每次调用都会触发新一轮的方法执行,没有任何中断逻辑,调用栈持续堆叠直到超出JVM栈容量上限。
  • 打印的坐标结果正确,是因为坐标计算逻辑在递归调用前已经执行完成,递归不会影响前置计算的输出结果。
修复方案

你的需求是单次叠加dx、dy偏移量后返回包装新坐标的Optional<Point>,不需要创建新的策略实例,也不需要递归调用,直接把计算得到的newLocation包装进Optional返回即可。修复后代码如下:

@Override
public Optional<Point> move(BlobView bv) 
{
      Point bvLocation = bv.getLocation();
      double bvRadius = bv.getRadius();
      
      int bv_X = bvLocation.x + dx;
      int bv_Y = bvLocation.y + dy;
      
      Point newLocation = new SimplePoint(bv_X, bv_Y);
      System.out.println("Point: (" + newLocation.x + ", " + newLocation.y + ")");
      
      // 直接包装新坐标返回,无需递归调用
      return Optional.of(newLocation);
}

如果业务逻辑要求坐标超出边界时返回空的Optional,可增加对应校验逻辑:

边界校验示例:

// 替换return语句即可,BOUNDARY_X、BOUNDARY_Y替换为业务实际的坐标上限值
if (bv_X >= 0 && bv_X < BOUNDARY_X && bv_Y >= 0 && bv_Y < BOUNDARY_Y) {
  return Optional.of(newLocation);
}
return Optional.empty();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 17:24:01