gpt4 book ai didi

java - 可迭代 : may iterator() returns null in case there is nothing to iterate over?

转载 作者:行者123 更新时间:2023-11-30 06:18:44 29 4
gpt4 key购买 nike

一个对象实现Iterable接口(interface)必须有一个带有此签名的方法:

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 是一种糟糕的编程实践。”

但是我的问题是关于返回 null 是否被 Java API 文档中的某些“约定”直接或间接阻止。对我来说,“返回一组 T 类型元素的迭代器”不会阻止返回 null。我可能是错的。

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

总体:除非在文档中明确说明,否则 Java API 没有说明迭代器值是否为 null 的意思。在这种情况下,没有说明任何内容,但是从理智上可以认为,空迭代器值永远不会从 Java API 方法返回。对于个人编写的 API,这可能会有所不同。

  • 文档中没有任何内容可以防止返回值为 null(例如 @NotNull)
  • 在 Javadoc 中,许多 @Return 都是显式的,而 null 也是可以预期的
  • This question是关于一般的 null 返回值,很有趣。
  • 我找到了 an attempt用于描述 API 的语言,尽管它用于 .NET

最佳答案

may iterator() returns null in case there is nothing to iterate over?

null 可能会返回(Java 中没有工具可以阻止您这样做)但它永远不应该是。而是返回 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,您将在 i.hasNext() 处得到 NullPointerException(因为i 将持有 null)。为了避免 NPE,您需要适当的迭代器实例,对于 hasNext() 将返回 false(如果没有要迭代的元素)。这将防止循环迭代。


除此之外,您的代码中还有其他问题

while(o.iterator().hasNext()) { ... }

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

你需要的是

Iterator<SomeType> it = o.iterator();
while(it.hasNext()) { ... }

关于java - 可迭代 : may iterator() returns null in case there is nothing to iterate over?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24097059/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com