Scala遍历可变ArrayBuffer时while循环出现无限循环是什么原因?
你遇到的无限循环和Scala变量更新机制无关,i的自增逻辑本身是正常的,问题出在循环终止条件的设计缺陷。
核心问题
你的循环仅判断了当前下标对应元素是否为Some,没有校验下标是否超出ArrayBuffer的合法长度范围:
- 若array1中所有已存储的元素全是
Some类型,当i增长到等于array1.length时,继续访问array1(i)本应抛出下标越界异常。如果此时有其他逻辑(比如异步线程)持续往array1末尾追加Some类型的元素,i的增长速度永远赶不上array1的扩容速度,就会进入无限循环。 - 若array1中不存在
None元素且没有其他线程修改集合,代码不会无限循环,而是直接抛出IndexOutOfBoundsException。
修复方案
在循环条件中补充下标边界判断即可解决问题:
var i=0 var counter = 0 // 优先判断下标合法性,再判断元素状态 while(i < array1.length && array1(i).isDefined){ counter += 1 i += 1 }
优化建议
Scala集合提供了内置操作可以直接实现相同的统计逻辑,不需要手动维护下标和计数器,代码更简洁也没有安全隐患:
// 统计ArrayBuffer开头连续为Some的元素个数 val counter = array1.takeWhile(_.isDefined).size
如果是多线程场景下操作这个可变ArrayBuffer,需要额外加锁保证线程安全,避免遍历过程中集合被修改导致的逻辑异常。
内容的提问来源于stack exchange,提问作者John Ron
相关产品推荐
相关产品推荐

