RuntimeException को फेंकने वाले तरीकों को विधि हस्ताक्षर में इंगित करना चाहिए?


86

उदाहरण के लिए, चौखटे / JDK में कई विधियाँ फेंक सकती हैं

java.lang.SecurityException 

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

जवाबों:


70

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

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


4
जावा कंपाइलर आपको घोषित RuntimeException को संभालने के लिए बाध्य नहीं करता है। तो आप उन्हें डेवलपर्स के लिए "संकेत" के रूप में घोषित कर सकते हैं। यह चर्चा योग्य है, अगर JavaDoc उसके लिए एक बेहतर जगह है। जाँच और अनियंत्रित अपवाद के बारे में बात महत्वपूर्ण है। जांचे और अनियंत्रित अपवाद हैं, जावा का वास्तव में क्या मतलब है (Compiletime-) अपवाद (चेक किया गया) और RuntimeException (अनियंत्रित)।
गार्जियन

5
वसंत में विधि हस्ताक्षर में अनियंत्रित अपवाद घोषित करना एक आम बात है।
nascar

38

से ओरेकल जावा ट्यूटोरियल :

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

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


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

18

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

उल्लेखित अनियंत्रित अपवादों की एक पूरी श्रृंखला है:

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.

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


6
यह उत्तर गलत है। आप Javadoc वक्तव्यों के बारे में बात कर रहे हैं, जबकि throwsविधि हस्ताक्षर में प्रश्न । ये एक ही बात नहीं हैं। हां, आपको अपने एपीआई द्वारा फेंके गए सभी अपवादों का दस्तावेज तैयार करना चाहिए , लेकिन सवाल यह नहीं है।
गिली

8

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

FYI करें: जैसे-जैसे समय आगे बढ़ रहा है (अब 2017 में) मैं अब तक केवल जावेदॉक में दस्तावेज करने और अधिक से अधिक जाँच किए गए अपवादों से बचने के लिए झुक रहा हूं।


3

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

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


3

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


1

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

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


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

1
मैं क्या कह रहा हूं कि डेवलपर को अपवादों को पकड़ने के लिए मजबूर नहीं किया जाना चाहिए। इसलिए विधि हस्ताक्षर में उन्हें घोषित करने की आवश्यकता नहीं है। जावा में, आप उन्हें रनटाइम अपवादों में बदल सकते हैं, जैसा कि वसंत कर रहा है। मैं यह भी कह रहा हूं कि रनटाइम अपवाद केवल गैर-वसूली योग्य स्थितियों पर फेंका जाना चाहिए।
किंजनाककिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.