鉴于Collection<Object> foo
,我通常会在迭代之前进行此检查:
if (foo != null && !foo.isEmpty()) {
for (Object f : foo) {
// ...
}
}
我只是想知道,这被认为是最佳做法吗?不应该isEmpty()
检查是多余的,因为for()
只会忽略空集合而不会抛出错误?
null
检查 - 是否有必要或是否有办法让for()
完全忽略null
收藏? (没有尝试捕捉for循环)
答案 0 :(得分:3)
isEmpty()检查不应该是多余的,因为for()只会忽略一个空集合而不会抛出错误吗?
这是多余的,在空集合上使用增强的for
是完全无害的。请注意,这样做会创建一个迭代器对象,因此检查可能会提供一些非常次要的内存流失保护,但通常如果这样做是值得的,那么你会有更大的要解决的问题。
null检查怎么样 - 是必要的还是有办法让for()简单地忽略null Collections? (没有尝试捕捉for循环)
除非您要捕获NPE(您说您不想这样做),否则您需要进行null
检查,或者您将允许NPE传播给调用者(例如,因为{ {1}}在逻辑上或类似的时候永远不应该是foo
。
答案 1 :(得分:0)
关于对isEmpty
的电话,我可以向您保证这是多余的。您甚至可能想要检查Joshua的Effective Java 2nd并重新访问从每个循环转换而来的代码。
答案 2 :(得分:0)
是的,确实如此。
如果代码的那一点可以为null,则可能只需要foo!= null。
答案 3 :(得分:0)
我最近遇到的最佳做法之一是使用CollectionUtils
if (org.apache.commons.collections.CollectionUtils.isNotEmpty(collectionName)) {
//Iterate through collectionName
}
Apache Commons的CollectionUtils.isNotEmpty(Collection)是一个NULL-SAFE检查
返回TRUE是Collection / List不为空且not-null如果Collection为Null则返回FALSE
以下示例:
List<String> properties = new ArrayList();
if (CollectionUtils.isNotEmpty(properties)) {
// process the list
} else {
// list is null or empty
}
需要jar:commons.collections.xxx.jar
答案 4 :(得分:0)
检查空集合
不,这不是多余的。你必须这样做以避免NPE。
检查空集合
是的,这是多余的。无需这样做。
答案 5 :(得分:0)
我没有看到.isEmpty条件中有任何用处,它只是给代码增加了噪音,使得代码的实际功能难以识别。
null检查怎么样 - 是必要的还是有办法让for()简单地忽略null Collections? (没有尝试捕捉for循环)
你应该总是在for-each循环之前检查null。这是您应该考虑的唯一解决方案,因为捕获NPE(和一般的RuntimeExceptions)是bad parctice。运行时异常用于表示在设计时未预料到的情况,这通常意味着编程错误。因此缓存此类异常可以隐藏代码中的真正错误。例如,如果你通过尝试捕获NullPointerException来包围for-each,你怎么知道发生了异常,因为集合是null而不是因为循环中的代码。
答案 6 :(得分:-1)
visibleTiles.isEmpty()
只检查地图是否为空(或)是否有任何元素。
ile = visibleTiles.keySet().iterator().next();
从迭代器中检索下一个元素。
在迭代器上执行hasNext()
之前,您需要进行next()
检查。
hasNext()
javadoc说
如果迭代有更多元素,则返回true。 (换一种说法, 如果next会返回一个元素而不是抛出一个元素,则返回true 异常。)所以,如果没有可用的元素,则在迭代器上调用next() 将返回NoSuchElementException。
除此之外,我认为你真的不想空检查
while (!visibleTiles.isEmpty())) {
....
}