Iterable:可能iterator()返回null,以防无法迭代?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Iterable:可能iterator()返回null,以防无法迭代?相关的知识,希望对你有一定的参考价值。
实现Iterable
接口的对象必须具有带此签名的方法:
Iterator<T> iterator()
o作为Iterable
,这段代码安全吗?
while(o.iterator().hasNext()) { ... }
换句话说,如果没有什么可以迭代的话,iterator()
可能会返回null吗?
编辑:
1-正如你们中的一些人所指出的那样,每次执行o.iterator()时返回的迭代器都是不同的。很公平!我必须同意在写这个问题时忘记了这一点。
让我们说这一行被重写:
Iterator<String> it = o.iterator();
....
....
while(it.hasNext() {...}
2-正如你们中的一些人所指出的,当Iterable.iterator()的文档说:“返回一组类型为T的元素的迭代器时,返回null是一种糟糕的编程习惯。”
但是我的问题是关于是否通过Java API文档中的某些“契约”直接或间接地阻止返回null。对我来说“返回一组T类型元素的迭代器”并不会阻止返回null。我可能错了。
从您的答案和其他研究结论
总体而言:Java API没有意思说迭代器值是否为null,除非在文档中明确说明它。在这种情况下,没有任何说明,但是很好的意义允许认为永远不会从Java API方法返回null迭代器值。对于个人编写的API,这可能会有所不同。
- 文档中没有任何内容可以防止返回的值为null(例如@NotNull)
- 在Javadoc中,当预期null时,许多@Return都是显式的
- This question一般是关于null返回值,有趣。
- 我发现an attempt用于描述API的语言,尽管它用于.NET
如果没有什么可以迭代的话,
iterator()
可以返回null
吗?
可能会返回null
(Java中没有工具可以阻止您这样做)但它永远不应该。而返回Iterator哪个hasNext()
方法返回false
。
您需要知道Iterable
对象的目的是与for-each循环一起使用
for (Type item : IterableInstance){
//handle 'item'
System.out.println(item);
}
which is translated to something like
for(Iterator<Type> i = someList.iterator(); i.hasNext(); ) {
Type item = i.next();
//handle 'item'
System.out.println(item);
}
因此,如果iterator()
返回null
,你将在NullPointerException
获得i.hasNext()
(因为i
将持有null
)。为了避免NPE,你需要适当的迭代器实例,对于hasNext()
,它将返回false
(如果没有要迭代的元素)。这将阻止循环迭代。
除了您的代码中还有其他问题
while(o.iterator().hasNext()) { ... }
你在这里做的是每次检查条件时都会创建新的迭代器,因为你正在调用o.iterator()
,它将从第一个元素开始迭代。换句话说,如果第一个元素存在,则每次都检查,如果o
不为空,则会导致无限循环。
你需要的是什么
Iterator<SomeType> it = o.iterator();
while(it.hasNext()) { ... }
换句话说,如果没有什么可以迭代的话,
iterator()
可能会返回null吗?
没有.Iterable
接口的正确实现永远不会从null
方法返回iterator()
。它将返回一个非null的Iterator
,其hasNext()
方法立即返回false
。
然而:
这段代码安全吗?
当然,但它没有做你认为它做的事情,因为iterator()
的契约是每次调用iterator()
时返回一个不同的迭代器。
以上是关于Iterable:可能iterator()返回null,以防无法迭代?的主要内容,如果未能解决你的问题,请参考以下文章
通过在子类型上返回 Iterator 来实现 Iterable
kotlin中的Sequences(序列)与Iterable(集合)区别
kotlin中的Sequences(序列)与Iterable(集合)区别