2009-05-05 13 views
51

उदाहरण के लिए, चौखटे में कई तरीके/JDKRuntimeException को फेंकने वाली विधियों को विधि हस्ताक्षर में इंगित करना चाहिए?

java.lang.SecurityException 

फेंक सकता है, लेकिन इस विधि हस्ताक्षर में नहीं दर्शाया गया है (क्योंकि है कि एक अभ्यास सामान्य रूप से जांचे हुए अपवादों के लिए आरक्षित है)। मैं तर्क देना चाहता हूं कि विधि sigs में RuntimeExceptions को घोषित करने के कई फायदे हैं (उदाहरण के लिए स्थिर प्रकार की जांच के समान)। क्या मैं नशे में हूं या अन्यथा?

उत्तर

42

मैं, हस्ताक्षर में एक अनियंत्रित अपवाद घोषित नहीं होगा, क्योंकि यह है कि एपीआई के उपयोगकर्ता के लिए भ्रामक है। अब यह स्पष्ट नहीं है कि अपवाद को स्पष्ट रूप से संभाला जाना है या नहीं।

जावाडोक में यह घोषणा एक बेहतर दृष्टिकोण के बाद से यह किसी को संभालने के लिए अगर उन्हें लगता है यह आवश्यक है की अनुमति देता है, लेकिन यह जानते हुए कि वे इसे अनदेखा कर सकते हैं अगर वे चाहते हैं। यह चेक और अनचेक स्पष्ट के बीच अलगाव बनाता है।

+1

जावा कंपाइलर घोषित रनटाइम अपवादों को संभालने के लिए आपको मजबूर नहीं करता है। तो आप डेवलपर्स के लिए "संकेत" के रूप में उद्देश्य के लिए उन्हें घोषित कर सकते हैं। यह चर्चा योग्य है, यदि जावाडॉक इसके लिए एक बेहतर जगह है। चेक और अनचेक अपवादों के बारे में बिंदु महत्वपूर्ण है। चेक किए गए और अनचेक अपवाद हैं कि जावा का वास्तव में क्या मतलब है (संकलन-) अपवाद (चेक) और रनटाइम अपवाद (अनचेक)। – Guardian667

+2

वसंत ऋतु में विधि हस्ताक्षर में अनचेक अपवादों की घोषणा एक आम प्रथा शुरू हुई। – danidacar

4

देखने की मेरी बात में यह विधि के लिए जावाडोक में कम से कम क्रम अपवाद घोषित करने के लिए बेहतर है। हस्ताक्षर में इसे घोषित करने से यह और भी स्पष्ट हो जाता है कि कुछ गलत होने पर क्या हो सकता है। यह जानकारी प्रदान करने का सुझाव देने का मेरा मुख्य कारण है।

एफवाईआई: जैसे समय बढ़ रहा है (अब 2017 में) मैं अब उन्हें केवल जावाडोक में दस्तावेज करने और जितना संभव हो सके अपवादों से बचने के लिए झुका रहा हूं।

1

यह checked exceptions के बारे में विचार-विमर्श से कोई लेना देना नहीं है। अधिकांश सहमत होंगे कि विधियों के हस्ताक्षर में अपवादों को घोषित नहीं किया जाना चाहिए।

वहाँ भी एक discussion के बारे में कैसे क्रम अपवाद इस्तेमाल किया जाना चाहिए है। मैं एक पोस्टर से सहमत हूं कि रनटाइम अपवादों को प्रोग्रामिंग त्रुटि या घातक स्थिति को इंगित करना चाहिए। इसलिए हस्ताक्षर में उन्हें घोषित करने में ज्यादा योग्यता नहीं है। प्रत्येक विधि संभावित रूप से एक के माध्यम से हो सकता है।

+0

तब एक पार्सिंग अपवाद या कुछ अन्य डेटा सत्यापन प्रकार अपवाद फिट है। आप यह कह रहे हैं कि आपको चेक अपवादों का उपयोग नहीं करना चाहिए, लेकिन तब सीमित करना चाहिए कि अनचेक अपवादों का उपयोग किस प्रकार किया जाना है। – Robin

+1

मैं जो कह रहा हूं वह यह है कि डेवलपर को चेक अपवादों को पकड़ने के लिए मजबूर नहीं किया जाना चाहिए। इसलिए विधि हस्ताक्षर में उन्हें घोषित करने की कोई आवश्यकता नहीं है। जावा में, आप रनटाइम अपवादों में उन्हें बदल सकते हैं, जैसा कि वसंत कर रहा है। मैं यह भी कह रहा हूं कि रनटाइम अपवाद केवल गैर-पुनर्प्राप्ति योग्य स्थितियों पर फेंक दिया जाना चाहिए। – kgiannakakis

3

मेरे विचार अनियंत्रित अपवाद में कभी नहीं विधि हस्ताक्षर में घोषित किया जाना चाहिए कि के रूप में उनके स्वभाव के विपरीत है।

यदि, हालांकि, एक विधि कुछ अनचेक अपवादों को फेंकने की संभावना है, तो जवाडोक में @ थ्रो में संभावित परिस्थितियों को ध्यान में रखते हुए दूसरों को दूसरों के लिए यह समझने में मदद मिल सकती है कि क्या गलत हो सकता है। यह

15

जावाडोक संग्रह # के लिए जोड़ने

एक पूरी नहीं है पर एक नजर डालें (जैसे बुरा इनपुट आदि के कारण एक एनपीई) के रूप में केवल हालांकि अपवाद के लिए उपयोगी है कि कॉल करने को संभालने में सक्षम होने की संभावना है है अनियंत्रित अपवाद के धसान उल्लेख किया:

Throws: 
UnsupportedOperationException - add is not supported by this collection. 
ClassCastException - class of the specified element prevents it from being added to this collection. 
NullPointerException - if the specified element is null and this collection does not support null elements. 
IllegalArgumentException - some aspect of this element prevents it from being added to this collection. 

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

+1

यह उत्तर गलत है। आप जवाडोक कथन के बारे में बात कर रहे हैं जबकि विधि हस्ताक्षर में 'फेंकता' के बारे में सवाल है। ये वही बात नहीं हैं। हां, आपको बिल्कुल * अपने एपीआई द्वारा फेंकने वाले सभी अपवादों को दस्तावेज करना चाहिए, लेकिन सवाल इसके बारे में नहीं है। – Gili

3

यदि आप दूसरों द्वारा उपयोग के लिए एपीआई लिख रहे हैं, तो एपीआई में आपके इरादे के स्पष्ट दस्तावेज़ीकरण के लिए पर्याप्त कारण है और विधि हस्ताक्षर में रनटाइम अपवादों को घोषित करने के लिए कोई नकारात्मक पक्ष नहीं है।

21
the Oracle Java tutorial से

:

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

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

+0

इस प्रकार, कंपाइलर को यह आवश्यक नहीं है कि आप रनटाइम अपवादों को पकड़ें या निर्दिष्ट करें (हालांकि आप कर सकते हैं)। – danidacar

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