假设我有以下代码:
for (AnyObject anyObject : anyObjectList) {
System.out.println(anyObject.doSomething());
}
我的问题是:我读到可以将null添加到至少某种类型的列表类型中。 如果我正确:在访问迭代类的方法之前,不应该总是进行空检查吗? 我只是问,因为我从来没有见过一个增强的for循环与这样的空检查,例如:
for (AnyObject anyObject : anyObjectList) {
if (anyObject != null) {
System.out.println(anyObject.doSomething());
}
}
答案 0 :(得分:3)
实际上,您通常想知道列表中是否存在随机null
。您的第一个代码段会抛出一个异常来指示问题,但是您的第二个代码段将默默消耗该错误。
您也可以这样做:
for (AnyObject anyObject : anyObjectList) {
if (anyObject != null) {
System.out.println(anyObject.doSomething());
} else {
/* something went wrong -- report error, debugging info, etc. */
}
}
答案 1 :(得分:0)
如果您不想在列表中显示null,那么大多数Queue
实施(除LinkedList
之外的明显例外)都不接受null
。
或者你也可以
使用Constraints
:
import com.google.common.collect.Constraints;
...
Constraints.constrainedList(new ArrayList(), Constraints.notNull())
来自Guava以获得最大的灵活性。
更好的做事方式是
try {
for (AnyObject anyObject : anyObjectList) {
System.out.println(anyObject.doSomething());
}
} catch (NullPointerException npe){
// Do your logging here !
}
答案 2 :(得分:0)
for (AnyObject anyObject : anyObjectList) { if (anyObject != null) { System.out.println(anyObject.doSomething()); } else { /* something went wrong -- report error, debugging info, etc. */ } }
这是一种非常糟糕的空检查方法。当出现null时,第2行不会执行事件。
StackFlowed的答案更好。
try {
for (AnyObject anyObject : anyObjectList) {
System.out.println(anyObject.doSomething());
}
} catch (NullPointerException npe){
// Do your logging here !
}
但我们可能必须跳过null并获取其他值。所以我找到了解决方案。代码必须是这样的:
for (AnyObject anyObject : checkIsEmpty(anyObjectList)) {
System.out.println(anyObject.doSomething());
}
private <T> Iterable<T> checkIsEmpty(Iterable<T> iterable) {
return iterable == null ? Collections.<T>emptyList() : iterable;
}