6
我不知道爲什麼聲納認爲,在下面的行可能會出現一個空指針異常:聲納:可能的空指針?
if (file == null || file.listFiles() == null || file.listFiles().length == 0) {//etc}
難道你們有什麼想法?
我不知道爲什麼聲納認爲,在下面的行可能會出現一個空指針異常:聲納:可能的空指針?
if (file == null || file.listFiles() == null || file.listFiles().length == 0) {//etc}
難道你們有什麼想法?
擴大對我的評論:
正因爲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
是修改並提供給其他線程,那麼幾乎所有的賭注都關閉。
僅僅因爲'file.listFiles()'的一個調用返回非''null'並不意味着下一個必然會做。 'file.listFiles().length'因此總是NPE風險。 –
也許在調用listFiles()'的時候出現'NullPointerException' *?或者'listFiles()'開始時返回非null值,但在第二次調用時返回null值? – Waggili
除了'listFiles()'改變的結果:文件對其他線程是可見的(IOW:它是一個字段還是一個局部變量)?他們可以在第一次調用後將其設置爲「null」。 – zapl