Iterable:可能iterator()返回null,以防无法迭代?

时间:2014-06-07 12:13:43

标签: java null iterator

实现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,这可能有所不同。

  • 文档中没有任何内容阻止返回的值为null(例如@NotNull)
  • 在Javadoc中,当预期null时,许多@Return都是明确的
  • This question一般是关于null返回值,有趣。
  • 我发现an attempt用于描述API的语言,尽管它适用于.NET

2 个答案:

答案 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()时返回不同的迭代器。