2015-09-15 6 views
6

मैं नहीं जानता कि क्यों सोनार का मानना ​​है कि निम्न पंक्ति में एक NullPointer अपवाद हो सकता है है:सोनार: संभावित नलपोइंटर?

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

तुम लोग किसी भी विचार है?

+10

सिर्फ इसलिए कि 'file.listFiles() 'गैर-' शून्य' का एक आमंत्रण का मतलब यह नहीं है कि अगला एक आवश्यक होगा। 'file.listFiles() लंबाई 'इसलिए हमेशा एक एनपीई जोखिम है। –

+0

हो सकता है कि 'NullPointerException' * सूची * सूची 'सूची' के अंदर * अंदर * होता है? या 'सूचीफाइल()' पहले कुछ गैर-शून्य देता है, लेकिन दूसरी कॉल पर 'शून्य'? – Waggili

+0

'सूचीफाइल()' बदलने के परिणाम के अलावा: 'फाइल' अन्य धागे के लिए दृश्यमान है (आईओओ: क्या यह एक फ़ील्ड है या सिर्फ एक स्थानीय चर है)? वे पहले आमंत्रण के बाद इसे 'शून्य' पर सेट कर सकते हैं। – zapl

उत्तर

10

मेरी टिप्पणी पर विस्तार:

सिर्फ इसलिए कि file.listFiles() रिटर्न में गैर-शून्य से एक मंगलाचरण अगले एक मतलब यह नहीं है जरूरी नहीं होगा। आप सामान्य रूप से एक ही विधि को वापस करने के लिए एक ही विधि (उसी ऑब्जेक्ट पर, एक ही ऑब्जेक्ट पर) के दो आमंत्रणों पर भरोसा नहीं कर सकते हैं, और संदर्भ प्रकार के मान को लौटने वाली कोई भी विधि, सिद्धांत रूप में null लौटा सकती है। प्रतिबिंब पर आप पहचान लेंगे कि आप अक्सर एक ही विधि के विभिन्न आमंत्रणों के लिए अलग-अलग परिणाम प्राप्त करने पर निर्भर करते हैं। file.listFiles().length इसलिए हमेशा एक एनपीई जोखिम है।

भले ही आप सोनार को File कक्षा (जो जरूरी नहीं लगता है) के विशिष्ट ज्ञान के लिए उम्मीद है, यह वास्तव में एनपीई फेंकने के लिए आपके यौगिक सशर्त अभिव्यक्ति के मूल्यांकन के लिए संभव है। सभी को होने की आवश्यकता है संदर्भित फ़ाइल को file.listFiles() के मूल्यांकन और file.listFiles().length के मूल्यांकन के बीच हटा दिया जाना चाहिए।

आप इस तरह इस विशेष समस्या को ठीक कर सकते हैं:

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

, के रूप में @zapi ने कहा, अगर file परिवर्तनीय और अन्य थ्रेड के लिए सुलभ है, तो काफी सभी दांव बंद कर रहे हैं।

संबंधित मुद्दे