Iterable:如果没有什么可迭代的,iterator() 是否可以返回 null?

min*_*ins 2 java null iterator

实现接口的对象Iterable必须具有具有以下签名的方法:

Iterator<T> iterator()
Run Code Online (Sandbox Code Playgroud)

o 作为Iterable,此代码安全吗?

while(o.iterator().hasNext()) { ... }
Run Code Online (Sandbox Code Playgroud)

换句话说,iterator()如果没有什么可迭代的,可能会返回 null?

编辑:

1-正如你们中的一些人指出的,每次执行 o.iterator() 时返回的迭代器都是不同的。很公平!我必须承认,我在写问题时忘记了这一点。

假设这一行被重写:

Iterator<String> it = o.iterator();
....
....
while(it.hasNext() {...}
Run Code Online (Sandbox Code Playgroud)

2- 正如你们中的一些人所指出的,当 Iterable.iterator() 的文档说:“返回一组 T 类型元素上的迭代器”时,返回 null 是一种不好的编程习惯。

然而,我的问题是,Java API 文档中的某些“契约”是否直接或间接阻止返回 null。对我来说,“返回 T 类型元素集合上的迭代器”并不能阻止返回 null。我可能错了。

根据您的回答和其他研究得出的结论

总体而言:Java API 没有办法说明迭代器值是否可以为 null,除非在文档中明确说明。在本例中,没有说明任何内容,但明智的做法是认为 Java API 方法永远不会返回 null 迭代器值。这对于个人编写的 API 可能会有所不同。

  • 文档中没有任何内容阻止返回值为空(例如@NotNull)
  • 在 Javadoc 中,当 null 也是预期的时候,许多 @Return 都是明确的
  • 这个问题一般是关于空返回值的,很有趣。
  • 我发现了一种描述 API 的语言的尝试,尽管它是针对 .NET

Psh*_*emo 5

如果没有什么可迭代的,可能iterator()会返回?null

null可能会被返回(Java 中没有任何工具可以阻止您这样做),但它永远不应该被返回。相反,返回 IteratorhasNext()方法返回false

您需要知道对象的目的是与for-each循环Iterable一起使用

for (Type item : IterableInstance){
    //handle 'item'
    System.out.println(item);
}
Run Code Online (Sandbox Code Playgroud)

这被翻译成类似的东西

for(Iterator<Type> i = someList.iterator(); i.hasNext(); ) {
    Type item = i.next();

    //handle 'item'
    System.out.println(item);
}
Run Code Online (Sandbox Code Playgroud)

因此,如果iterator()返回,null您将得到NullPointerException(i.hasNext()因为i将保持null)。为了避免 NPE,您需要适当的迭代器实例,forhasNext()将返回false(如果没有要迭代的元素)。这将防止循环迭代。


除了您的代码中存在其他问题之外

while(o.iterator().hasNext()) { ... }
Run Code Online (Sandbox Code Playgroud)

您在这里所做的是,每次检查条件时都会创建新的迭代器o.iterator(),因为您正在调用它将从第一个元素开始迭代。换句话说,您每次都会检查第一个元素是否存在,如果o不为空,这可能会导致无限循环。

你需要的是

Iterator<SomeType> it = o.iterator();
while(it.hasNext()) { ... }
Run Code Online (Sandbox Code Playgroud)