ListIterator.next()返回null

时间:2014-07-23 14:09:46

标签: java iterator listiterator

我的问题非常非常简单,但我在网上发现的一切都告诉我,我正在以正确的方式做到这一点 - 但我显然误解了一些事情。

我有一个简单,简单的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()检查的原因。我理解错了什么,以及正确的方法是什么?

3 个答案:

答案 0 :(得分:12)

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

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

以上列表包含3个元素。第二个是null。

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

答案 1 :(得分:1)

ListIterator文档说明next()

  

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

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

while( rolesIterator.hasNext() ) {
    Role roleObject = rolesIterator.next();
    if(roleObject != null)
    {
        String role = roleObject.getName();
        [...]
    }

答案 2 :(得分:0)

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

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

for (Role roleObject : currentUser.getRoles()) {
...
}