2015-09-15 5 views
6

bilmiyorum?Sonar: Olası bir nullpointer?</p> <pre><code>if (file == null || file.listFiles() == null || file.listFiles().length == 0) {//etc} </code></pre> <p>siz bir fikrin var mı: Sonar aşağıdaki satırda bir NullPointer İstisna oluşabilir düşünüyor neden

+10

Sadece bir dosya ismi "file_name" döndürmez, bir sonraki adın mutlaka yapacağı anlamına gelmez. 'file.listFiles().' bu nedenle her zaman bir NPE riskidir. –

+0

Belki de "NullPointerException" oluşur * içinde * listFiles() 'için çağrı? Veya 'listFiles()', ilk başta boş olmayan bir şey döndürür, ancak ikinci çağrıda 'null' değerini döndürür? – Waggili

+0

"listFiles()" değişiminin sonucunun yanı sıra: Diğer dosyalara (dosya: IOW: bir alan mı yoksa yerel değişken mi)? İlk çağrıdan sonra 'null' olarak ayarlayabilirler. – zapl

cevap

10

benim yorumum Genişleyen: boş olmayan file.listFiles() getiri biri çağırma sonrakini anlamına gelmez çünkü

mutlaka yapacağız. Genelde, aynı değeri döndürmek için aynı yöntemin (aynı nesne üzerinde, aynı argüman ile) iki çağrısına güvenemezsiniz ve bir referans türü değeri döndüren herhangi bir yöntem, ilke olarak, null'u döndürebilir. Yansıma üzerinde, aynı yöntemin farklı davetleri için genellikle farklı sonuçlar aldığınızı fark edeceksiniz. file.listFiles().length bu nedenle her zaman bir NPE riskidir. Sonar'ın File sınıfına dair belirli bir bilgiye sahip olmasını (hatta makul görünmediği) bilseniz bile, bileşik bir koşullu ifadenizin bir NPE ataması için gerçekten mümkündür. Tüm yapılması gereken, başvurulan dosyanın file.listFiles() değerlendirmesi ve file.listFiles().length değerlendirmesi arasında kaldırılmasıdır.

Böyle bu özel sorunu düzeltmek olabilir: @zapi söylediği gibi file modifiye ve diğer parçacıkları tarafından erişilebilir olması durumunda, Tabii

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

ardından hemen hemen tüm biter.

İlgili konular