2015-09-15 9 views
6

ソナーは、次の行で発生する、NullPointer例外が発生する可能性があることと考えて、なぜ私は知らない。ソナー:nullpointerがありますか?

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

は君たちがどんな考えを持っていますか?

file.listFiles()リターンの1回の呼び出し、null以外は、次のいずれかが必ずやるという意味ではありませんという理由だけで:私のコメントに拡大

+10

'file.listFiles()'を1回だけ呼び出すと、 'null'以外の値が返されるだけで、次のファイルが必ず実行されるわけではありません。 'file.listFiles()。length'は常にNPEの危険です。 –

+0

おそらく 'NullPointerException'は' listFiles() 'の呼び出しの中で*発生しますか?あるいは、 'listFiles()'は最初はnull以外の何かを返しますが、2回目の呼び出しでは 'null'ですか? – Waggili

+0

'listFiles()'の結果の変更以外にも、 'file'は他のスレッドから見えますか(IOW:フィールドかローカル変数か)?彼らは最初の呼び出しの後に 'null'に設定することができます。 – zapl

答えて

10

。同じ値を返すために同じメソッドの同じ呼び出し(同じオブジェクトで、同じ引数で)の呼び出しには一般に頼ることはできません。参照型の値を返すメソッドは、原則としてnullを返します。リフレクションでは、同じメソッドのさまざまな呼び出しで異なる結果が得られることがよくあります。したがって、file.listFiles().lengthは常にNPEリスクです。

Fileクラス(必ずしも妥当ではないと思われる)についての特定の知識をSonarに期待しても、化合物の条件式の評価でNPEを投げることは本当に可能です。実行される必要があるのは、評価されたファイルがfile.listFiles()の評価とfile.listFiles().lengthの評価の間に削除されることだけです。

次のようなこの特定の問題が修正できます。@zapiはfileが変更と他のスレッドにアクセス可能な場合は、ほとんど全てのベットがオフになっている、言ったように、もちろん

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

を。

関連する問題