循环的意外行为用"直到"

时间:2018-04-19 09:02:57

标签: scala for-loop nullpointerexception

最近,我开始学习Scala的学校项目。赋值说我们必须删除未排序数组的元素,而不必留下" hole"在数组中。我已经制作了以下代码:

private var _list = new Array[NAW](20)
private var _highestIndex = 0;

def removeAllbyName(name : String): Unit = {
 for(i <- 0 until _highestIndex){
   if(_list(i).name == name)
     deleteByIndex(i)
 }
}

def deleteByIndex(i : Int) : Unit = {
  if(i != -1){
    for(x <- i until _highestIndex){
      _list(x) = _list(x + 1)
    }
    _highestIndex -= 1
  }
}

我在数组中填充了10个实例,maximumIndex将是10并且在第一次删除之后9.但是for循环仍然计数到9,这导致空指针异常,即使我们使用&#34 ;直到&#34 ;.调试器确实认识到_highestIndex是9.有人可以解释为什么会发生这种情况吗?

提前致谢!

2 个答案:

答案 0 :(得分:0)

0 until _highestIndex只会被评估一次。

for (i <- 0 until _highestIndex) {
  if (_list(i).name == name)
    deleteByIndex(i)
}

相当于:

val range = 0 until _highestIndex
for (i <- range) {
  if (_list(i).name == name)
    deleteByIndex(i)
}

您可以看到范围仅确定一次。

您可以尝试使用while循环,或在if语句中使用guard。

答案 1 :(得分:0)

更改for-loop内的deleteByIndex,以避免exception

  for(
      x <- i until highestIndex
      if (x + 1) < highestIndex
     )
     list(x) = list(x + 1)