为什么增强for循环不执行空检查

时间:2010-10-21 05:48:50

标签: java

为什么增强的for循环在迭代集合之前不执行空值检查。

3 个答案:

答案 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;
}