实现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()的文档说:&#34;返回一个类型为T的元素集的迭代器时,返回null是一种糟糕的编程习惯。&#34 ;
但是我的问题是关于是否通过某些合同直接或间接防止返回null。在Java API文档中。给我&#34;返回一组T&#34类型元素的迭代器;不会阻止返回null。我可能错了。
您的答案和其他研究的结论
总体而言:除非在文档中明确说明,否则Java API没有任何意义可以说迭代器值是否为null。在这种情况下,没有任何说明,但是很好的意义允许认为永远不会从Java API方法返回null迭代器值。对于个人编写的API,这可能有所不同。
答案 0 :(得分:3)
可能会返回如果没有任何要迭代的内容,
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()) { ... }
你在这里做的是每次检查条件时都会创建 new iterator ,因为你正在调用o.iterator()
,它将从第一个元素开始迭代。换句话说,每次检查第一个元素是否存在时都会检查,如果o
不为空,则会导致无限循环。
您需要的是
Iterator<SomeType> it = o.iterator();
while(it.hasNext()) { ... }
答案 1 :(得分:1)
换句话说,如果没有什么要迭代的话,
iterator()
可能会返回null吗?
没有。 Iterable
接口的正确实现永远不会从null
方法返回iterator()
。它将返回一个非空Iterator
,其hasNext()
方法会立即返回false
。
然而:
这段代码安全吗?
当然,但它不会按照您的想法执行,因为iterator()
的约定是每次调用iterator()
时返回不同的迭代器。