2009-11-29 15 views
15

मैंने सोचा था कि जावा शॉर्ट सर्किट मूल्यांकन किया था, अभी तक इस लाइन अभी भी एक नल पॉइंटर एक्सेप्शन फेंक जाता है:जावा शॉर्ट सर्किट मूल्यांकन

if((perfectAgent != null) && (perfectAgent.getAddress().equals(entry.getKey()))) { 

इस मामले perfectAgentnull है, तो मैं बस पूरे अभिव्यक्ति false लौटना चाहते , लेकिन मेरा ऐप अभी भी इस लाइन पर एक NullPointerException के साथ दुर्घटनाग्रस्त है।

संपादित करें, सामान्य प्रतिक्रिया:

perfectAgent के बाद से, null, && के अधिकार के लिए कुछ भी नहीं मार डाला जाना चाहिए है, क्योंकि यह असंभव है अभिव्यक्ति सच होने के लिए। इस बिंदु पर, perfectAgent.getAddress() निष्पादित करना असंभव है क्योंकि perfectAgent में वैध संदर्भ नहीं है (यह शून्य और सभी है)। मैं शॉर्ट सर्किट मूल्यांकन का उपयोग करने की कोशिश कर रहा हूं ताकि अलग-अलग कथन में नल की जांच न हो क्योंकि तर्क अधिक गड़बड़ कर देता है।

संपादित 2 (या, मैं मूर्ख हूं): हाँ, जीवन में कई चीजों की तरह आप दुनिया को यह घोषणा करने के बाद सही जवाब देते हैं कि आप एक मूर्ख हैं। इस मामले में, मैंने कुछ और करने के दौरान एक्लिप्स के ऑटोबल्ड को बंद कर दिया था और इसे वापस चालू नहीं किया था, इसलिए मैं कक्षा फाइलों को डीबग कर रहा था जो मेरे स्रोत से मेल नहीं खाती थीं।

+6

क्या आपने जांच की है कि यह प्रविष्टि शून्य नहीं है? –

+0

प्रविष्टि शून्य नहीं है। – Donnie

+1

यदि 'perfectAgent'' null' है तो वास्तव में उस शेष पंक्ति को निष्पादित नहीं किया जाना चाहिए। इसके साथ कोई समस्या नहीं दिख रही है क्योंकि यह अब है:/ – Joey

उत्तर

4

उन्नत डिबगिंग सबक # 1:

आप (उदाहरण के लिए एक है कि जावा के बारे में आप ज्ञान के विपरीत है) एक असंभव लगने वाली त्रुटि आ रही हों, निम्न कार्य करें:

  • एक सम्मानित पाठ से परामर्श करें पुस्तक (या बेहतर अभी भी, प्रासंगिक मानक) यह पुष्टि करने के लिए कि आपकी समझ त्रुटिपूर्ण नहीं है। (इस मामले में आपकी समझ सही थी, और किसी भी अर्ध-सभ्य पाठ्यपुस्तक एक मिनट में इसकी पुष्टि करेगी।)

  • उन सभी बेवकूफ चीजों की जांच करें जो आप कर सकते थे जो असंभव त्रुटि का कारण बन सकता है।ऐसी चीजें जैसे फ़ाइल को सहेजना, पूर्ण निर्माण नहीं करना, एप्लिकेशन का पुराना/पुराना संस्करण चलाना, गलत निर्देशिका में होना आदि।

संक्षेप में, अपने आप को थोड़ा और संदेह करना सीखें।

2

आप यह सुनिश्चित करें कि perfectAgent रिक्त नहीं है, इसलिए एक या perfectAgent.getAddress() अधिक की या entry या entry.getKey() अशक्त होना चाहिए। या getAddress() या getKey() उनके कार्यान्वयन में एक एनपीई मार रहे हैं।

इस तरह की चीज़ को डीबग करने के लिए, स्थान को पिन करने के लिए पहले स्टैक ट्रेस पर देखें। यह आपको बताएगा कि यह getAddress() में या getKey() में या चिपकाए गए कोड स्निपेट में हो रहा है जो उन्हें कॉल करता है। अगला, अगर यह इस स्निपेट में है, तो परीक्षण करने से पहले कुछ कोड जोड़ें जो शून्य है। आप अच्छी पुरानी System.err.println() या assertions का उपयोग कर सकते हैं। (आप कथनों का उपयोग करते हैं, उन्हें जावा आदेश के -enableassertions ध्वज के साथ सक्षम करने के लिए सुनिश्चित करें।)

अद्यतन: तो मेरी व्याख्या निकला गलत होने के लिए ... समस्या दो विरोधाभासी तथ्य प्रस्तुत (वहाँ एक एनपीई था इस लाइन पर और फिर भी शॉर्ट-सर्किट हुआ होगा) और मैंने स्वचालित रूप से माना कि पहला तथ्य सच था और दूसरी झूठी जब वास्तव में यह ग्रहण में ऑटो-बिल्ड को बंद करने के कारण पूरी तरह से एक अलग समस्या थी। ओह! कुछ "असंभव" डीबग करने में यह मूल रूप से संदेहजनक होने में मदद करता है।

7

जावा में शॉर्ट सर्किट मूल्यांकन है। शायद entrynull है और इसलिए entry.getKey()NullPointerException का कारण बन रहा है। एक और संभावना यह है कि getAddress() या तो null लौटाता है या NullPointerException कहीं अंदर हो रहा है (यदि यह एक साधारण return कथन से अधिक जटिल है)।

संपादित करें: मैं अपने संपादित जहाँ आप इस का दावा देखें:

बात करने के लिए अधिक है, यह असंभव है perfectAgent.getAddress() निष्पादित करने के लिए ...

लेकिन क्या होगा अगर perfectAgent.getAddress() सफलतापूर्वक क्रियान्वित किया जाता है और null लौटाता है? देखो मेरा मतलब है...

  • perfectAgent.getAddress()
  • प्रविष्टि
  • entry.getKey()

तोड़ अप बयान या:

0

perfectAgent के अलावा अन्य तीन संदर्भ है कि रिक्त हो सकता है कर रहे हैं इसे एक डीबगर में चलाएं।

+0

'entry.getKey() 'शून्य होने के कारण ओपी के कोड स्निपेट में' NullPointerException' नहीं होगा। – Asaph

+0

ऑब्जेक्ट.equals (शून्य) हमेशा झूठी वापसी करता है। तो यह प्रविष्टि नहीं होगी .getKey() शून्य वापस लौट रहा है। तो यह सूचीबद्ध पहले दो में से एक होना चाहिए। –

+0

आह हाँ, आप दोनों सही हैं। केवल पहले दो उम्मीदवार हैं। –

10

तो perfectAgent सही मायने में शून्य है, कि कोड (कम से कम वहाँ अजीब सूत्रण बातें, पर जा रहा गैर-शून्य से इसे बदलने अभिव्यक्ति के माध्यम से आधे रास्ते शून्य पर नहीं कर रहे हैं यह सोचते हैं) एक अपवाद फेंक नहीं होंगे। अगर आप ऐसा कर रहे एक छोटे लेकिन पूर्ण कार्यक्रम का प्रदर्शन कर सकते हैं तो मैं पूरी तरह से चौंक गया होगा।

तो हाँ, आपका अंतर्ज्ञान सही है - यह कोई समस्या नहीं होनी चाहिए। कारण के लिए कहीं और देखो। मुझे दृढ़ता से संदेह है कि perfectAgent वास्तव में शून्य नहीं है, और आप उस कोड में किसी अन्य परिस्थिति में भाग रहे हैं जो अपवाद का कारण बन सकता है।

मेरा सुझाव है कि आप उस संक्षिप्त कोड को एक संक्षिप्त लेकिन पूर्ण उदाहरण में निकालने का प्रयास करें - यदि आप ऐसा कर सकते हैं, तो मैं अपनी रूपक टोपी खाऊंगा; यदि नहीं, तो आप निष्कर्ष निकालने का प्रयास करते समय समस्या को ढूंढ लेंगे।

आपको क्या लगता है कि perfectAgent वास्तव में शून्य है? यह पहले यह कोड डालने का प्रयास करें:

if (perfectAgent == null) 
{ 
    System.out.println("Yup, it's null"); 
} 

एक और बहुत, बहुत पतली संभावना है कि आप एक JIT बग आई है है - लेकिन मैं अत्यधिक यह शक है।

+0

ओह, हाँ, मुझे नहीं लगता था कि यह एक जेआईटी बग था, बस यह पता लगाने की कोशिश कर रहा था कि मैंने क्या किया है। – Donnie

+0

आपने जो कोड दिखाया है उसमें आपने कुछ भी गलत नहीं किया - कम से कम कुछ भी ऐसा नहीं करेगा। मुझे संदेह है कि यह कुछ भी है जो आपको विश्वास करने के लिए प्रेरित करता है कि परिपूर्ण एंजेंट शून्य है :) –

+0

मेरा संपादन 2 देखें। नाक पर दाएं। – Donnie

1

बिग मिस्टर। मैंने आपकी कोड की लाइन कॉपी की और perfectAgent == null, entry == null, entry.getKey() == null और उन के संयोजनों के साथ परीक्षण किया: मेरे टेस्ट बेड में कोई एनपीई (जावा 1.6)।

जो भी कष्टप्रद बग है, मुझे संदेह है कि शॉर्ट सर्किट मूल्यांकन के साथ इसका कुछ संबंध है। यदि यह लाइन एनपीई का कारण बनती है, जहां तक ​​मैं कह सकता हूं, perfectAgent शून्य नहीं है। गुड लक और - एक बार आप इसे catched किया है हमें बग दिखाने :)

0

इस तरह अपने कोड स्वरूपण का प्रयास करें:

if( 
    (perfectAgent != null) 
    && (
     perfectAgent.getAddress() 
     .equals(
     entry.getKey() 
    ) 
    ) 
) { 

यह आप एक बेहतर स्टैक ट्रेस लाइन प्रवेश देना चाहिए।

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