iterator本身不抛nullpointerexception,但底层集合为null或遍历时未校验元素是否为null会导致npe;需确保集合非null、遍历时判空、避免迭代中修改集合结构,并可结合optional安全处理。

Java 中 Iterator 本身不会直接抛出 NullPointerException,但调用它之前若底层集合为 null,或在遍历时对元素做非空操作时未校验,就容易触发空指针异常。关键不是 Iterator 有问题,而是使用方式不当。
确保集合对象不为 null
最常见错误是直接对一个 null 集合调用 iterator():
- ❌ 错误写法:List
list = null; Iterator it = list.iterator(); // 立即 NPE - ✅ 正确做法:使用前判空,或初始化为空集合(推荐)
List<string> list = getItems();<br> if (list == null) list = Collections.emptyList();<br> Iterator<string> it = list.iterator();</string></string>
遍历时注意元素可能为 null
即使集合本身不为 null,其中的元素仍可能是 null。若后续调用 next() 后直接调用方法(如 toString()、length()),就会 NPE:
- ❌ 危险代码:
String s = it.next(); int len = s.length(); // s 为 null 时崩溃 - ✅ 安全写法:先检查元素是否为
nullwhile (it.hasNext()) {<br> String s = it.next();<br> if (s != null) {<br> System.out.println(s.length());<br> } else {<br> System.out.println("null element");<br> }<br> }
避免在迭代中修改集合结构
虽然这不直接导致 NullPointerException,但会引发 ConcurrentModificationException,部分开发者误以为是 NPE;更隐蔽的是,某些并发集合(如 CopyOnWriteArrayList)虽线程安全,但其 Iterator 是快照式,修改原集合不影响迭代器——此时若误用 remove() 或 add(),也可能因逻辑错乱间接引入空值。
- ✅ 安全删除:使用
Iterator.remove()(仅限当前元素)while (it.hasNext()) {<br> String s = it.next();<br> if ("target".equals(s)) it.remove(); // ✅ 合法<br> } - ❌ 禁止操作:
list.remove(...)或list.add(...)在遍历时调用
用增强 for 循环 + Optional 简化空值处理(Java 8+)
如果业务允许,用 for-each 更简洁,配合 Optional 处理可能为空的元素:
for (String s : list) {<br> Optional.ofNullable(s)<br> .map(String::length)<br> .ifPresent(System.out::println);<br> }- 优势:语义清晰、自动规避
s == null场景下的方法调用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











