如果语句忽略了返回方法,其他解决方案?

时间:2016-02-13 15:47:43

标签: java arraylist methods 2d-games

我有一个名为Cells的类,其中有一个运行这段代码的更新方法:

if(goalReached){
  if(returnNearestCell() > -1 && isTarget && this.checkCollide(cells.get(returnNearestCell()).x, cells.get(returnNearestCell()).y, cells.get(returnNearestCell()).mass)){
    addMass(cells.get(returnNearestCell()).mass);
    cells.get(returnNearestCell()).mass = 20;
    cells.get(returnNearestCell()).x = (int) Math.floor(Math.random() * 1001);
    cells.get(returnNearestCell()).y = (int) Math.floor(Math.random() * 701);
    isTarget = false;
  }
  if(returnNearestCell() > -1 && !isTarget){
    goalX = cells.get(returnNearestCell()).x; 
    goalY = cells.get(returnNearestCell()).y; 
    target = cells.indexOf(returnNearestCell());
    isTarget = true;

  }else if(returnNearestCell() == -1 ){ 
    goalX = (int) Math.floor(Math.random() * 1001);
    goalY = (int) Math.floor(Math.random() * 701);
    isTarget = false;
  }
  if(!isTarget){
    addMass(5);
  }
  goalReached = false;
}

基本上总结一下,每个细胞寻找质量较小的最近细胞,如果找到细胞,则将goalX和goalY设置为该细胞的位置。如果没有找到具有相同标准的此类单元格,则只需进入随机位置。代码工作正常,直到由于某种原因第一个if语句被忽略:

returnNearestCell() > -1

然后我得到一个ArrayIndexOutOfBoundsException。

我的returnNearestCell方法如下:

public int returnNearestCell(){

int x = 0;
int distance = 9999999;
int min = distance;

for(Cell cell : cells){
  if(this != cell){
    distance = (int)Math.sqrt((this.x - cell.x)*(this.x - cell.x ) + (cell.y - this.y)*(cell.y  - this.y));
    if(distance < min && this.mass > cell.mass + 10){
      min = distance;
      x = cells.indexOf(cell);
    }else if(distance < min && this.mass < cell.mass + 10 && cell.cellCount == cells.size()){
      x = -1;
    }
  }
}

return x;
}

此方法返回具有条件或-1的单元格的索引。我的问题是:有没有办法避免这种OutofBoundsException?我尝试了多种方法,比如进行双重检查,但我仍然遇到同样的问题。

1 个答案:

答案 0 :(得分:1)

cells.get(returnNearestCell()).mass = 20;
cells.get(returnNearestCell()).x = (int) Math.floor(Math.random() * 1001);
cells.get(returnNearestCell()).y = (int) Math.floor(Math.random() * 701);

在这里,您正在改变单元格,然后再次调用returnNearestCell()。由于该方法现在使用更改的参数运行,因此返回值可能不同。最重要的是,您沿着x坐标移动单元格,然后在下一次调用returnNearestCell()进行评估时,它会处于不同的位置。

您可能需要查找非原子更新并发修改以获取有关此主题的更多信息。

  

有没有办法将对象存储到变量中并通过该变量访问它?

是的,这是解决问题的方法:

if (goalReached) {
   // retrieve nearest cell once before modification
   final int nearestCellIndex = returnNearestCell();
   if (nearestCellIndex > -1 && isTarget) {
       // save cell.
       final Cell nearestCell = cells.get(nearestCellIndex);

       if (this.checkCollide(nearestCell.x, nearestCell.y, nearestCell.mass)) {

            // remainder of your code
       }
   }
}

请注意,最好让returnNearestCell()直接返回Optional<Cell>或至少Cell个对象。 checkCollide()同样可以将Cell对象作为参数。