迭代器isEmpty()调用导致noSuchElement异常?

kev*_*inl 2 java android iterator hashmap

我目前有以下代码

while (!visibleTiles.isEmpty())) {
    tile = visibleTiles.keySet().iterator().next();
    if (tile != null){
        bitmap = visibleTiles.remove(tile);
        if(bitmap != null && !containsKey(tile)){ //safe to recycle if tile cache is not actively holding it
            bitmap.recycle();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我在网上遇到了NoSuchElementException崩溃

tile = visibleTiles.keySet().iterator().next();
Run Code Online (Sandbox Code Playgroud)

使用isEmpty()方法和调用hasNext()调用有很大区别吗?我知道哈希图没有hasNext()调用,所以我做了以下工作:

while (visibleTiles.keySet().iterator().hasNext()) {
    tile = visibleTiles.keySet().iterator().next();
    if (tile != null){
        bitmap = visibleTiles.remove(tile);
        if(bitmap != null && !containsKey(tile)){ //safe to recycle if tile cache is not actively holding it
            bitmap.recycle();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

显然,我知道我应该只运行该应用程序,看看它是否崩溃,但是问题是很难重现该问题。

谢谢!

kos*_*osa 5

visibleTiles.isEmpty()

只需检查map是否为空(或)它是否包含任何元素。

ile = visibleTiles.keySet().iterator().next();
Run Code Online (Sandbox Code Playgroud)

从迭代器中检索下一个元素。

您需要hasNext()在进行next()迭代器之前进行检查。

hasNext() javadoc

如果迭代具有更多元素,则返回true。(换句话说,如果next将返回一个元素而不是引发异常,则返回true。)

因此,如果没有可用的元素,则next()对iterator的调用将返回NoSuchElementException

最重要的是,我认为您真的想不要清空支票

while (!visibleTiles.isEmpty())) {
....
}
Run Code Online (Sandbox Code Playgroud)