2015-09-15 43 views
6

我不知道爲什麼聲納認爲,在下面的行可能會出現一個空指針異常:聲納:可能的空指針?

if (file == null || file.listFiles() == null || file.listFiles().length == 0) {//etc} 

難道你們有什麼想法?

+10

僅僅因爲'file.listFiles()'的一個調用返回非''null'並不意味着下一個必然會做。 'file.listFiles().length'因此總是NPE風險。 –

+0

也許在調用listFiles()'的時候出現'NullPointerException' *?或者'listFiles()'開始時返回非null值,但在第二次調用時返回null值? – Waggili

+0

除了'listFiles()'改變的結果:文件對其他線程是可見的(IOW:它是一個字段還是一個局部變量)?他們可以在第一次調用後將其設置爲「null」。 – zapl

回答

10

擴大對我的評論:

正因爲file.listFiles()返回非空一個調用並不意味着下一次一定會做。原則上,一般不能依賴兩個相同方法的調用(在同一個對象上,具有相同的參數)返回相同的值,任何返回參考類型值的方法原則上都可以返回null。經過反思,您會意識到,您經常依靠針對同一方法的不同調用獲得不同的結果。因此,file.listFiles().length始終是NPE的風險。

即使您期望Sonar對File類具有特定的知識(這看起來並不合理),但真正有可能評估您的複合條件表達式來拋出NPE。所有需要進行的工作是在評估file.listFiles()和評估file.listFiles().length之間刪除參考文件。

你可以糾正這樣的這一具體問題:

File[] files; 
if (file == null || (files = file.listFiles()) == null || files.length == 0) { /* ... */ } 

當然,作爲@zapi說,如果file是修改並提供給其他線程,那麼幾乎所有的賭注都關閉。