4

我的问题非常非常简单,但是我在网上找到的所有内容都告诉我我的做法是正确的——但我显然误解了一些东西。

我有一个简单的 Java ListIterator,它在 while-hasNext() 循环中为 next() 返回 null。这是我对调试状态的评论的代码:

[...]
ListIterator<Role> rolesIterator = currentUser.getRoles().listIterator();
// rolesIterator is now: java.util.ArrayList$ListItr
while( rolesIterator.hasNext() ) {
        Role roleObject = rolesIterator.next(); // extra step for debugging reasons
        String role = roleObject.getName(); // NullPointerException - roleObject is null
[...]

在我看来,如果没有 next() 对象,则不应进入循环——这就是我使用 hasNext() 检查的原因。我理解错了什么,正确的方法是什么?

4

3 回答 3

14

列表中有一个下一个元素,而这个下一个元素恰好为空。例如:

List<String> list = new ArrayList<>();
list.add("foo");
list.add(null);
list.add("bar");

上面的列表有 3 个元素。第二个是空的。

修复填充列表的代码并确保它不会在列表中添加任何 null 角色,或者在循环内检查 null 以避免 NullPointerExceptions。

于 2014-07-23T14:13:56.243 回答
1

ListIterator文档指出next()

抛出: NoSuchElementException - 如果迭代没有下一个元素

此外,您可以hasNext()作为循环条件进行适当的检查。所以显而易见的结论是currentUser.getRoles()包含null元素。要修复 [这部分] 您的代码:

while( rolesIterator.hasNext() ) {
    Role roleObject = rolesIterator.next();
    if(roleObject != null)
    {
        String role = roleObject.getName();
        [...]
    }
于 2014-07-23T14:18:16.450 回答
0

我相信列表可以包含空值。所以 roleObject 可以为空。

我更喜欢 for 循环方法(更清洁):

for (Role roleObject : currentUser.getRoles()) {
...
}
于 2014-07-23T14:15:28.997 回答