为什么增强的for循环在迭代集合之前不执行空值检查。
答案 0 :(得分:31)
如果你的意思是这会爆炸:
int[] array = null;
for (int x : array) {
}
...然后我认为抛出一个NullPointerException
是完全正确的。另一种方法是让它以静默方式吞下null,并将其视为等效于空数组。这不是Java在其他地方采用的方法 - 为什么这会有所不同?这会使语言不一致。
我希望的一个地方 更多处理(但是显式处理)正在启用一个枚举 - 能够为null提供一个案例会很好,以避免检查那个特殊价值预先。但这是一个非常不同的结构,它特别试图对不同的值采取不同的行动。
答案 1 :(得分:5)
我有点害怕对抗Jon Skeet ......:| ... 但到底是什么......你怎么看待这种情况?:
`
findMoney(List<Places> places){
int money = 0;
for(Place place : places){
money += searchWithCare(place);
}
return money;
}
`
如果我让一些客户告诉我要去哪里,他什么都不告诉我。你认为抛出NullPointerException更好吗?可能是管理对这个方法的调用所以如果参数为null则不调用它?.... 我认为返回0是一致的响应,因为这里没有错误。我相信例外是管理代码的流程,我不明白为什么我应该在这种情况下改变流程。返回一个cero甚至一个null可能是一个很好的回应,不是吗?
那么这个解决方案呢? `
findMoney(List<Places> places){
int money = 0;
for(Place place : places == null ?Collections.<Place>emptyList():places){
money += searchWithCare(place);
}
return money;
}
`
答案 2 :(得分:1)
代码必须是这样的:
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;
}