2012-01-23 7 views
10

मैं जावा के बारे में यह मुख्य बात पूछ रहा हूं, लेकिन मुझे लगता है कि यह पूरी भाषाओं का पालन करता है।नल पॉइंटर अपवादों को पकड़ना

पर विचार करें,

if(myVariable==null){ 
     doSomethingAboutIt(); 
} 
else carryOn(myVariable); 

और

try{ 
    carryOn(MyVariable); 
}catch(NullPointerException e){ 
     doSOmethingAboutIt();} 

इन दोनों कोड ब्लॉक मूलतः एक ही हैं? क्या दूसरा दृष्टिकोण चुनने का कोई कारण है? बेशक यह bette rif होगा मेरी वैरिएबल कभी शून्य नहीं थी, लेकिन ऐसा लगता है कि इसके लिए जांच करने का सबसे अच्छा तरीका एक सरल कथन करना है।

+6

'NullPointerException की प्रोग्रामर त्रुटियों पर विचार किया जाना चाहिए। उन्हें पकड़ो मत। सुनिश्चित करें कि वे कभी नहीं फेंक दिया। –

उत्तर

7

मेरे रुख से, मैं इरादे के बराबर इन दो कोड ब्लॉक पर विचार करने में संकोच नहीं कर रहा हूं। निश्चित रूप से, वे एक ही त्रुटि प्रबंधन से गुज़रते हैं, लेकिन यह डेवलपर का निर्णय किसी और चीज़ से अधिक है।

मेरे लिए, if परीक्षण करने के लिए यह देखने के लिए कि कोई मान उपयोग किया जा सकता है, और यदि यह नहीं हो सकता है, तो यह इस मुद्दे के आसपास काम कर रहा है। try...catch ब्लॉक है मानते हुए मान मान्य है, और यदि ऐसा नहीं है, तो यह अबाध व्यवहार के आसपास काम करने के माध्यम से आता है।

असाधारण रूप से विचार किया जाना चाहिए जब अबाउट, प्रोग्राम ब्रेकिंग कोड होता है (विभाजित-शून्य, आदि)।

2

ठीक है, अपने आप में, carryOn(MyVariable); कभी एक एनपीई, फेंक नहीं होगा जब तक carryOn भीतर कुछ और एक अशक्त उदाहरण पर एक विधि या संपत्ति कॉल संदर्भित कर रहा है।

अपवाद पकड़ने अधिक computationally महंगा है पहले, आदि इसके लिए जाँच के रूप में एक अपवाद की पीढ़ी उत्पन्न किया जा करने के लिए एक स्टैक ट्रेस की आवश्यकता की तुलना में

मैं बहस चाहते हैं कि यह "स्वच्छ" कोड में जो परिणाम के रूप में अच्छी तरह से ।

यह भी देखें: - Java try/catch performance, is it recommended to keep what is inside the try clause to a minimum? - Try Catch Performance Java

2

आप केवल असाधारण घटनाओं के लिए अपवाद का उपयोग करें। कोड के पहले ब्लॉक के साथ जाओ, दूसरा नहीं।

0

पहला दृष्टिकोण अपवाद को पकड़ने से बेहतर है क्योंकि कुछ प्रदर्शन जुर्माना हुआ है। मेरी राय में सबसे अच्छा तरीका Null Object pattern लागू करना है। गुवा पुस्तकालय Optional कक्षा प्रदान करता है ताकि आप अपना खुद का निर्माण करने के बजाय लीवरेज कर सकें।

3

नहीं, वे कोड ब्लॉक बिल्कुल समान नहीं हैं।

पहले कोड ब्लॉक में, आप जांच कर रहे हैं कि myVariablenull है, और आप इसे केवल एक बिंदु पर कर रहे हैं। बाद में, myVariablenull बन सकता है और अंत में NullPointerException फेंक सकता है। यदि ऐसा होता है, तो दूसरा कोड स्निपेट अपवाद पकड़ लेगा, लेकिन पहले नहीं होगा।

इसके अलावा, दूसरा कोड स्निपेट NullPointerExceptions पकड़ लेगा जिसे carryOn(myVariable) कॉल के परिणामस्वरूप कॉल स्टैक में कहीं से भी फेंक दिया जा सकता है। यह भयानक है; आप इस धारणा के तहत एक अपवाद निगल रहे हैं कि एक विशेष चर null है जब यह पूरी तरह से कुछ और हो सकता है।

पहला कोड स्निपेट का उपयोग करें।

+0

एक अलग विचार। यदि आप कभी भी _any_ रनटाइम अपवाद (जैसे 'NullPointerException') को पकड़ रहे हैं, तो आप शायद कुछ गलत कर रहे हैं। प्रोग्रामेटिक रूप से निर्धारित करना बेहद मुश्किल है जहां ऐसे अपवाद आते हैं, इसलिए उन्हें सही तरीके से संभालना बेहद मुश्किल है। – cheeken