2010-10-21 78 views
18

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

+1

你可以指定你的代码,你在做什么,一些细节? – 2010-10-21 05:50:47

+1

我想这个问题是关于为什么'为(X y:(列表)null){...}'抛出一个NPE ... – 2010-10-21 05:53:11

+0

重复http://stackoverflow.com/questions/2250031 – 2011-02-16 21:50:14

回答

31

如果你的意思是,这会去的一声:

int[] array = null; 
for (int x : array) { 
} 

...那么我认为这是完全恰当,要抛出一个NullPointerException。另一种方法是让它静静地吞下null,然后把它当作一个空数组。这不是Java在其他地方采用的方法 - 为什么这应该与众不同?这会使语言不一致。

的一个地方,我希望能有多处理(但显式处理)被接通枚举 - 这将是很好能够为空提供的情况下,为避免事先检查是一个特殊的价值。但这是一个非常不同的结构,它专门针对不同的价值观采取不同的行动。

+3

用于切换枚举的'null'情况是一个有趣的想法,但是如果你有一个'default:'但没有明确的'case null:',并且枚举值是'null',会发生什么。如果'null'转到违反向后兼容性的默认情况,并且如果'null'是错误的值则不好。如果你得到一个NPE,那么'default'的行为就会在语义上不一致。 (它现在意味着“默认除非它为空......”) – 2010-10-21 06:20:30

+1

@Stephen C:好问题。我不确定引入它现在是否是一个好主意,但是我认为当功能第一次被引入时我们会很高兴。 – 2010-10-21 06:22:30

+0

我认为,即使那样(假设)它已经是一个糟糕的主意了,但还是有足够的“皱纹”。也许如果Java 1.0也有可空的tyoes ... – 2010-10-21 06:33:31

5

我有点害怕对Jon Skeet说:... | ... 但是,什么是地狱......你怎么看待这个情况?:

`

findMoney(List<Places> places){ 
    int money = 0; 
    for(Place place : places){ 
    money += searchWithCare(place); 
    } 
return money; 
} 

`

如果我问一些客户告诉我去哪里找他什么都没告诉我。你认为在这里抛出NullPointerException更好吗?可能是管理对这个方法的调用,所以如果参数为空不调用它?... 我认为返回0是一致的响应,因为没有错误在这里。我相信异常是用来管理代码流的,我不明白为什么我应该在这种情况下改变流程。返回一个cero或甚至一个null可能是一个很好的回应,不是吗?

那么这个解决方案呢? `

findMoney(List<Places> places){ 
    int money = 0; 
    for(Place place : places == null ?Collections.<Place>emptyList():places){ 
    money += searchWithCare(place); 
    } 
return money; 
} 

`

+0

这真的很有帮助。我从来没有见过'集合。 emptyList()'成语之前。如果你可以这样做,我可能会认为它是'Collections.emptyList ()',但显然不是。你知道这个成语在哪里被记录吗?我无法找到它。 – 2014-06-27 09:30:43

+0

我试图找到它!我不能......这是一个秘密? :)对不起 – 2014-07-03 11:51:28

+0

唉,谢谢你无论如何尝试。这是很难找到的亲属。 – 2014-07-03 13:45:10

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