私はJavaで学校の課題に取り組んでいますが、答えが見つからないエラーに遭遇しました。gethit()
どういうわけか、返されたオブジェクトでメソッドを呼び出すとiterator.next()
、スタック オーバーフロー例外が発生します。gethit()
メソッド(この特定のケースでは)が再帰的にそれ自体を呼び出すためだと思います。とはいえ、再帰が 2 レベルまたは 3 レベルの深さしかなく、オブジェクトが過剰な量のメモリを使用しないため、スタック オーバーフローが発生するのは奇妙だと思います。
のshoot()
最初の呼び出しを行うメソッドgethit()
public void shoot() {
assert canHaveAsEnergy(energy - 1000);
//Search the target position.
Position laserPos = new Position(getPos().getX(), getPos().getY(), getPos().getBoard());
do {
long nextX = laserPos.getX() + new Double(orientation.getDirection().getX()).longValue();
long nextY = laserPos.getY() + new Double(orientation.getDirection().getY()).longValue();
laserPos.setX(nextX);
laserPos.setY(nextY);
} while (getPos().getBoard().canHaveAsPosition(laserPos) && (! getPos().getBoard().hasAsPosition(laserPos)));
//Hit every entity on the target position.
for (Entity entity : getPos().getBoard().getAllEntitiesOn(laserPos)) {
entity.getHit();
}
setEnergy(energy - 1000);
}
getHit()
自分自身を再帰的に呼び出すメソッド。
public void getHit() {
ArrayList<Position> neighbours = new ArrayList<Position>();
Position northPos = new Position(getPos().getX(), getPos().getY() - 1, getPos().getBoard());
Position eastPos = new Position(getPos().getX() + 1, getPos().getY(), getPos().getBoard());
Position southPos = new Position(getPos().getX(), getPos().getY() + 1, getPos().getBoard());
Position westPos = new Position(getPos().getX() - 1, getPos().getY(), getPos().getBoard());
neighbours.add(northPos);
neighbours.add(eastPos);
neighbours.add(southPos);
neighbours.add(westPos);
for (Position pos : neighbours) {
if (getPos().getBoard().hasAsPosition(pos)) {
Iterator<Entity> iterator = getPos().getBoard().getAllEntitiesOn(pos).iterator();
while (iterator.hasNext()) {
//Somehow this gives a stack overflow error
iterator.next().getHit();
}
}
}
System.out.println(this.toString() + " takes a hit and explodes.");
getPos().getBoard().removeAsEntity(this);
terminate();
}