如何修复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
相关产品推荐
相关产品推荐

