2010-10-21 134 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; 
}