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 可能会有所不同。
如果没有什么可迭代的,可能
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)
| 归档时间: |
|
| 查看次数: |
17805 次 |
| 最近记录: |