2015-06-23 7 views
12

जब भी मैं अगर एक पद्धति के लिए दिए गए मापदंडों अशक्त नहीं हैं की जाँच करने के लिए किया था, मैं अगर शून्य की जांच में विफल रहता है एक अशक्त चेक लिखने और एक IllegalArgumentException फेंकने के लिए इस्तेमाल किया कुछ जावा 8 कक्षाएं जैसे कि ArrayList, मुझे पता चला कि ओरेकल Objects.requireNonNull का उपयोग कर शून्य मान के विरुद्ध पैरामीटर की जांच करने के लिए कर रहे हैं, और फिर, यदि परीक्षण विफल रहता है, तो NullPointerException फेंक दिया जाता है।ऑब्जेक्ट्स। रिक्वेयर नॉननुल (टी ओबीजे) नल चेक के बदले और मैन्युअल रूप से अवैध अर्ग्यूमेंट एक्सेप्शन फेंक दिया?</p> <pre><code>if (user == null) { throw new IllegalArgumentException("User can't be null."); } </code></pre> <p>हालांकि, के स्रोत कोड को पढ़ कर:

इस तरह, पहले कोड स्निपेट इस दृष्टिकोण अपनाकर इस तरह दिखना चाहिए:

Objects.requireNonNull(user, "User can't be null."); 

छोटे और अधिक पठनीय।

मान लिया जाये कि मैं, प्रणाली के पूरे अपवाद संचालन के नियंत्रण है (यहां तक ​​कि कि मैं नहीं, कभी कभी यह व्यापार इन अनियंत्रित अपवाद को संभालने के लिए का हिस्सा है चाहिए), मैं अपने IllegalArgumentExceptionsNullPointerException और उपयोग के साथ बदलना चाहिए Objects.requireNonNull अपनी खुद की शून्य जांच और अपवाद फेंकने के बजाय?

+9

हम नए कोड के लिए जेडीके में ऐसा कर रहे हैं, और पुराने कोड को व्यवस्थित रूप से अनुकूलित कर रहे हैं। और भविष्य में यह काफी संभव है कि जेवीएम अंततः ऑब्जेक्ट्स। रिक्वेयर नॉननुल को घुसपैठ कर देगा, जो इसे पसंद करने का एक और कारण है। "क्या मुझे एनपीई या आईएई का उपयोग करना चाहिए" बहस ज्यादातर राठोल है; दोनों स्थितियां रक्षात्मक हैं, और उनके बीच बहस करने का अधिकांश प्रयास बर्बाद हो गया है। –

+1

जब ब्रायन गोएट्ज़ कहते हैं कि वह इसे एक तरह से कर रहा है, तो संभावना है कि आप इसे करना चाहते हैं ;-)। – Daniel

+0

@BrianGoetz, इस तरह से जब मैं इन शून्य जांच विफल रहता हूं तो मैं 'NullPointerException' को अपनाना पसंद करूंगा। यहोशू ने अपनी किताब में 'आईएई' पर 'एनपीई' की प्राथमिकता पहले से ही कहा है, और जेडीके के भविष्य के बारे में आपने जो कहा है उसे पढ़कर, मुझे लगता है कि मेरे पास इस तरह से पर्याप्त सबूत हैं। वैसे, @OSryx उत्तर एक और प्रकार की पैरामीटर जांच को लागू करने के लिए मान्य है। –

उत्तर

10

Objects.requireNonNull(c) का उपयोग करना यह जांचने का एक बहुत ही शानदार तरीका है कि तत्व शून्य नहीं है या नहीं। लेकिन NullPointerException या IllegalArgumentException ->IllegalArgumentException or NullPointerException for a null parameter? चुनने के बारे में एक दिलचस्प चर्चा है। तो NullPointerException फेंकने का जावा तरीका यह है कि एक संदर्भ शून्य है।

अन्यथा, आप अपनी खुद की विधि requireNotNull() बना सकते हैं। यह सरल है:

public static <T> T requireNonNull(T obj) { 
     if (obj == null) 
      throw new NullPointerException(); 
     return obj; 
    } 

और आप IllegalArgumentException द्वारा अपवाद NullPointerException बदल सकते हैं।

+0

चर्चा के शीर्ष मूल्यांकन उत्तरों ने यहां जवाब के साथ एक बिंदु बनाया है। 'IllegalArgumentException' अधिक उपयुक्त दिखता है, इसलिए मैं अभी भी 'ऑब्जेक्ट्स.क्वायर नॉटनुल' के अपने" अपने संस्करण "के साथ संयुक्त रूप से उपयोग कर सकता हूं, जो अपवाद को फेंकता है। –

+4

सावधान रहें, कभी-कभी शीर्ष रेटेड उत्तर शायद सबसे पुराना है;) –

+2

आप सही हैं। थोड़ा और खोज करके, मुझे पता चला है कि यहां तक ​​कि जोशुआ ब्लोच ने 'IllegalArgumentException' के बजाय' NullPointerException' के उपयोग का बचाव किया, मैंने यह सुनिश्चित करने के लिए अपनी पुस्तक खोली। अब मैं समझता हूं कि इसे कभी-कभी "पवित्र युद्ध" प्रश्न के रूप में क्यों जाना जाता है, दोनों दृष्टिकोणों के अच्छे अंक होते हैं। हालांकि, यह चर्चा इस विषय का विचार नहीं है, इसलिए मैं जल्द ही आपका उत्तर स्वीकार कर सकता हूं। –

6

इस बात पर चर्चा है कि किसी विधि को शून्य मूल्य प्राप्त होने पर किस प्रकार का अपवाद फेंक दिया जाना चाहिए, इसकी उम्मीद नहीं है। कुछ लोग NullPointerException के लिए बहस करते हैं, कुछ लोग IllegalArgumentException के लिए बहस करते हैं। ऐसा लगता है कि जेडीके का तरीका ऐसे मामलों में NullPointerException फेंकना प्रतीत होता है, यही कारण है कि Objects.requireNonNull इसे फेंकता है।

लेकिन मैं इस विधि के कारण मौजूदा कोड को संशोधित नहीं करता, हालांकि आप नए कोड में Objects.requireNonNull का उपयोग करने पर विचार करना चाहेंगे। (इसका उपयोग आम तौर पर कोड को नल की जांच करने और मैन्युअल रूप से अपवाद को फेंकने से अधिक पठनीय बनाता है।)

+2

जहां मैं काम करता हूं, हमने अपना स्वयं का 'Ensure.notNull (ऑब्जेक्ट वैल, स्ट्रिंग msg) बनाया है, जो मूल रूप से वही काम करता है। हालांकि यह हुप्जे द्वारा संकेतित कारणों के लिए 'अवैध अवैधकरण' धारणा 'NullPointerException' नहीं फेंकता है। हमने इसे बेहतर पाया है क्योंकि यह आकस्मिक एनपीएक्स से स्पष्ट रूप से अलग गैर-शून्य तर्कों को स्पष्ट करता है। यद्यपि मैंने इसे अभी तक हमारे कोड बेस में नहीं किया है, फिर भी मैंने एक नया 'NullArgumentException' बनाने' पर विचार किया है ('अवैध अर्ग्यूमेंट एक्सेप्शन' 'बढ़ाता है और इसे फेंक देता है। – Paul

+1

यह "* हमने यह बेहतर पाया है क्योंकि यह आकस्मिक एनपीएक्स से स्पष्ट रूप से अलग गैर-शून्य तर्कों को स्पष्ट करता है। *" थोड़ा सा म्यूट है - जब आपको एनपीई मिलती है तो आपके पास एक लाइन नंबर भी होता है ताकि आप इस विशिष्ट मामले में देख सकें कि तर्क शून्य है - और 'Objects.requireNonNull' आपको इच्छित त्रुटि संदेश प्रदान करने की अनुमति देता है। – assylias

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