java iter是否存在_关于java:Iterable:如果没有要迭代的内容,iterator()是否可以返回null?...

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

Iterator< T > iterator()

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

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

换句话说,如果没有要迭代的内容,iterator()是否可以返回null?

编辑:

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

假设此行被重写:

Iterator it = o.iterator();

....

....

while(it.hasNext() {...}

2-正如某些人指出的那样,当Iterable.iterator()的文档说:"返回一组T类型的元素的迭代器时,这会返回null,这是一种不好的编程习惯。"

但是,我的问题是Java API文档中的某些"合同"是直接还是间接防止返回null。对我来说,"在一组T类型的元素上返回迭代器"并不能防止返回null。我可能是错的。

答案和其他研究得出的结论

总体而言:Java API无意说明迭代器的值是否可以为null,除非在文档中明确指出。在这种情况下,什么也没有说,但是明智的做法是认为Java API方法永远不会返回null迭代器值。对于个人编写的API,可能会有所不同。

文档中没有任何内容可以防止返回的值为空(例如@NotNull)

在Javadoc中,当还可以预期为null时,许多@Return是显式的

这个问题通常是关于空返回值的,很有趣。

我发现了一种尝试描述API的语言,尽管它是针对.NET的。

为什么在循环中调用o.iterator()? 只需获取一次即可,只需先调用hasNext()。

不是根据文档。 (显然,这并不能阻止某人编写确实返回null的实现,但这将违反接口。)

该文档说:返回一组T类型的元素上的迭代器。不包括null。

@mins null不是一组元素的迭代器。

也没有包含任何null。 JDK Javadoc散布着@return标记,这些标记指定可以返回null。 如果在这种情况下不存在,则您无权承担任何责任。

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);

}

这被翻译成类似

for(Iterator 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 it = o.iterator();

while(it.hasNext()) { ... }

谢谢。这似乎是完整的答案。关于迭代器每次被评估的新实例:同意,但是可以说这行被重写了:while(it.hasNext(){...},它已经被赋值一次。请为您的声明提供参考?

我不确定您要查找哪种参考。纯粹的逻辑似乎足以说明null绝不应该作为iterator()的结果返回。您需要知道Iterable对象主要用于for-each循环(for(T element : IterableInstance))。如果要实现iterable(),您是否希望使用代码的人每次在for-each中使用NullPointerException时也必须处理NullPointerException?

@mins换句话说,允许返回null(没有防止它的机制),但是它是非常糟糕的设计,因此不应使用。例如,Collection框架中的类(ArrayList,HashSet,..,)从不返回null。您可以通过查看其源代码进行检查。

是的,这就是我的观点...您说的很有意义,但是我找不到任何表明返回的迭代器不允许为空的协定。 null对于返回Iterator < T >的方法来说不是无效的返回值,对吗?

In other terms, may iterator() returns null in case there is nothing to iterate over?

否。Iterable接口的正确实现永远不会从其iterator()方法返回null。它将返回一个非空的Iterator,其hasNext()方法立即返回false。

然而:

is this code safe?

当然可以,但是它并没有像您想的那样做,因为iterator()的约定是每次调用iterator()时都返回一个不同的迭代器。

好的,iterator()每次都会返回一个不同的实例。我已经编辑了我的问题。您是否有一些参考来支持关于不允许null的答案?据我所知null是返回类型Iterator < T >的有效值吗?

是的,从某种意义上说,null是任何引用类型的有效"值"。但是,如上所述,null并不是对一组元素的迭代器,这是Iterable#iterator() s方法的JavaDoc所说的返回值。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值