जवाबों:
आम तौर पर RuntimeExceptions हैं अपवाद है कि प्रोग्राम के रूप में रोका जा सकता है। उदाहरण के लिए NullPointerException
, ArrayIndexOutOfBoundException
। यदि आप null
किसी भी तरीके को कॉल करने से पहले जांचते हैं, NullPointerException
तो कभी नहीं होगा। ArrayIndexOutOfBoundException
यदि आप पहले सूचकांक की जाँच करते हैं तो इसी तरह कभी नहीं होगा। RuntimeException
संकलक द्वारा जांच नहीं की जाती है, इसलिए यह साफ कोड है।
EDIT : इन दिनों लोग इसके पक्ष में हैं RuntimeException
क्योंकि यह साफ कोड का उत्पादन करता है। यह पूरी तरह से एक व्यक्तिगत पसंद है।
RuntimeException
क्योंकि यह सरल है, और चेक किए गए और अनियंत्रित अपवादों के बीच के अंतर के बारे में सोचने की आवश्यकता को कम करता है। मुझे लगता है कि रनटाइम अपवादों को पकड़ना एक भयानक विचार है क्योंकि आप इस तरह के अपरिवर्तनीय अपवादों को पकड़ लेंगे NullPointerException
।
जावा में, दो प्रकार के अपवाद हैं: चेक किए गए अपवाद और अन-चेक किए गए अपवाद। एक चेक किए गए अपवाद को कोड द्वारा स्पष्ट रूप से नियंत्रित किया जाना चाहिए, जबकि, एक अन-चेक किए गए अपवाद को स्पष्ट रूप से नियंत्रित करने की आवश्यकता नहीं है।
चेक किए गए अपवादों के लिए, आपको या तो कोड के चारों ओर एक कोशिश / कैच ब्लॉक डालना होगा जो संभावित रूप से अपवाद को फेंक सकता है, या विधि में "थ्रो" क्लॉज जोड़ सकता है, यह इंगित करने के लिए कि विधि इस प्रकार के अपवाद को फेंक सकती है (जो होना चाहिए) कॉलिंग क्लास या उससे ऊपर) में संभाला।
कोई अपवाद जो "अपवाद" से उत्पन्न होता है, एक जाँच अपवाद है, जबकि एक वर्ग जो RuntimeException से प्राप्त होता है, संयुक्त राष्ट्र का जाँच है। RuntimeException को कॉलिंग कोड द्वारा स्पष्ट रूप से नियंत्रित करने की आवश्यकता नहीं है।
वर्गों java.lang.RuntimeException
और java.lang.Exception
वर्गों के बीच अंतर को देखने से पहले , आपको Exception
पदानुक्रम पता होना चाहिए । दोनों Exception
और Error
कक्षाएं वर्ग से ली गई हैं Throwable
(जो कक्षा से प्राप्त होती हैं Object
)। और वर्ग वर्ग RuntimeException
से लिया गया है Exception
।
सभी अपवाद Exception
या तो से व्युत्पन्न हैं RuntimeException
।
सभी अपवाद जो व्युत्पन्न होते RuntimeException
हैं, उन्हें अनियंत्रित अपवाद कहा जाता है। और अन्य सभी अपवादों की जाँच अपवाद हैं। एक चेक अपवाद को आपके कोड में कहीं पकड़ा जाना चाहिए, अन्यथा, यह संकलन नहीं करेगा। इसीलिए उन्हें जाँच अपवाद कहा जाता है। दूसरी ओर, अनियंत्रित अपवादों के साथ, कॉल करने की विधि इसे संभालने या घोषित करने के लिए बाध्य नहीं है।
इसलिए सभी अपवाद जो संकलक आपको संभालने के लिए मजबूर करते हैं, सीधे से प्राप्त होते हैं java.lang.Exception
और अन्य सभी संकलक जो आपको संभालने के लिए मजबूर नहीं करते हैं, से व्युत्पन्न हैं java.lang.RuntimeException
।
निम्नलिखित RuntimeException के प्रत्यक्ष ज्ञात उपवर्गों में से कुछ हैं ।
AnnotationTypeMismatchException,
ArithmeticException,
ArrayStoreException,
BufferOverflowException,
BufferUnderflowException,
CannotRedoException,
CannotUndoException,
ClassCastException,
CMMException,
ConcurrentModificationException,
DataBindingException,
DOMException,
EmptyStackException,
EnumConstantNotPresentException,
EventException,
IllegalArgumentException,
IllegalMonitorStateException,
IllegalPathStateException,
IllegalStateException,
ImagingOpException,
IncompleteAnnotationException,
IndexOutOfBoundsException,
JMRuntimeException,
LSException,
MalformedParameterizedTypeException,
MirroredTypeException,
MirroredTypesException,
MissingResourceException,
NegativeArraySizeException,
NoSuchElementException,
NoSuchMechanismException,
NullPointerException,
ProfileDataException,
ProviderException,
RasterFormatException,
RejectedExecutionException,
SecurityException,
SystemException,
TypeConstraintException,
TypeNotPresentException,
UndeclaredThrowableException,
UnknownAnnotationValueException,
UnknownElementException,
UnknownTypeException,
UnmodifiableSetException,
UnsupportedOperationException,
WebServiceException
एक अपवाद की जाँच की जाती है, और एक RuntimeException अनियंत्रित है।
चेक किए गए का मतलब है कि संकलक के लिए आवश्यक है कि आप किसी अपवाद में अपवाद को संभालें, या इसे फेंकने के रूप में अपनी विधि की घोषणा करें (या इसके किसी सुपरक्लासेस में से एक)।
आम तौर पर, अगर एपीआई का कॉलर अपवाद को संभालने के लिए अपेक्षित है, और एक अनियंत्रित अपवाद, अगर यह ऐसा कुछ है, जिसे कॉल करने वाला व्यक्ति सामान्य रूप से संभाल नहीं पाएगा, जैसे कि मापदंडों में से एक, यानी प्रोग्रामिंग के साथ एक अपवादित अपवाद को फेंक दें। गलती।
रनटाइम अपवाद वर्ग (RuntimeException और उसके उपवर्ग) को संकलन-समय की जाँच से छूट दी गई है, क्योंकि कंपाइलर स्थापित नहीं कर सकता है कि रन-टाइम अपवाद उत्पन्न नहीं हो सकता है। (जेएलएस से)।
आपके द्वारा डिज़ाइन की जाने वाली कक्षाओं में आपको अपवाद को उप-वर्ग करना चाहिए और किसी भी असाधारण परिदृश्य को इंगित करने के लिए इसके उदाहरणों को फेंकना । ऐसा करने से आप अपने वर्ग के ग्राहकों को स्पष्ट रूप से संकेत देंगे कि आपकी कक्षा का उपयोग अपवाद फेंक सकता है और उन्हें उन असाधारण परिदृश्यों को संभालने के लिए कदम उठाने होंगे।
नीचे दिए गए कोड स्निपेट इस बिंदु की व्याख्या करते हैं:
//Create your own exception class subclassing from Exception
class MyException extends Exception {
public MyException(final String message) {
super(message);
}
}
public class Process {
public void execute() {
throw new RuntimeException("Runtime");
}
public void process() throws MyException {
throw new MyException("Checked");
}
}
वर्ग प्रक्रिया की उपरोक्त वर्ग परिभाषा में , विधि execute
एक RuntimeException को फेंक सकती है लेकिन विधि घोषणा को यह निर्दिष्ट करने की आवश्यकता नहीं है कि यह RuntimeException को फेंकता है ।
विधि process
एक चेक किए गए अपवाद को फेंकता है और उसे यह घोषणा करनी चाहिए कि वह तरह के MyException के चेक किए गए अपवाद को फेंक देगा और ऐसा नहीं करना एक संकलित त्रुटि होगी।
उपरोक्त वर्ग की परिभाषा कोड को प्रभावित करेगी जो प्रोसेस क्लास का भी उपयोग करती है ।
कॉल new Process().execute()
एक वैध आह्वान है जहां फॉर्म का कॉल
new Process().process()
संकलन त्रुटि देता है। ऐसा इसलिए है क्योंकि क्लाइंट कोड को हैंडल करने के लिए कदम उठाने चाहिए MyException
(कहते हैं कि कॉल टू प्रोसेस () कोशिश / कैच ब्लॉक में संलग्न किया जा सकता है)।
RuntimeException का उचित उपयोग?
यदि किसी ग्राहक से किसी अपवाद से उबरने की अपेक्षा की जा सकती है, तो उसे एक अपवाद बना दें। यदि कोई क्लाइंट अपवाद से पुनर्प्राप्त करने के लिए कुछ नहीं कर सकता है, तो उसे अनियंत्रित अपवाद बनाएं।
ध्यान दें कि एक अनियंत्रित अपवाद एक से लिया गया है RuntimeException
और एक चेक किया गया अपवाद एक से निकला है Exception
।
RuntimeException
अगर एक ग्राहक अपवाद से उबरने के लिए कुछ नहीं कर सकता है तो क्यों फेंकें ? लेख बताता है:
रनटाइम अपवाद समस्याओं का प्रतिनिधित्व करते हैं जो एक प्रोग्रामिंग समस्या का परिणाम हैं, और इस तरह, एपीआई क्लाइंट कोड से उनसे ठीक होने या किसी भी तरह से उन्हें संभालने की अपेक्षा नहीं की जा सकती है। ऐसी समस्याओं में अंकगणितीय अपवाद शामिल हैं, जैसे कि शून्य से विभाजित करना; सूचक अपवाद, जैसे अशक्त संदर्भ के माध्यम से किसी वस्तु तक पहुंचने की कोशिश करना; और अनुक्रमणिका अपवाद, जैसे कि एक सूचकांक के माध्यम से एक सरणी तत्व तक पहुंचने का प्रयास करना जो बहुत बड़ा है या बहुत छोटा है।
ओरेकल दस्तावेज से:
यहां नीचे पंक्ति दिशानिर्देश है: यदि किसी ग्राहक से किसी अपवाद से उबरने की उम्मीद की जा सकती है, तो इसे एक अपवाद बनाएं। यदि कोई क्लाइंट अपवाद से पुनर्प्राप्त करने के लिए कुछ नहीं कर सकता है, तो उसे अनियंत्रित अपवाद बनाएं।
रनटाइम अपवाद समस्याओं का प्रतिनिधित्व करते हैं जो एक प्रोग्रामिंग समस्या का परिणाम हैं और इस तरह, एपीआई क्लाइंट कोड को उनसे ठीक होने या किसी भी तरह से उन्हें संभालने की उम्मीद नहीं की जा सकती है।
रनटाइमएक्सपेक्टेशन के उदाहरणों के अनुसार "रन के अपवादों को अवैध उपयोग द्वारा अपवाद" की तरह हैं: अवैधस्टैटेस्ट अपवाद, नेगेटिवअप्रेशनइसेप्शन, NullpointerException
अपवादों के साथ आपको इसे स्पष्ट रूप से पकड़ना चाहिए क्योंकि आप अभी भी पुनर्प्राप्त करने के लिए कुछ कर सकते हैं। अपवाद के उदाहरण हैं: IOException, TimeoutException, PrintException ...
सरल शब्दों में, यदि आपका क्लाइंट / उपयोगकर्ता अपवाद से पुनर्प्राप्त कर सकता है, तो इसे एक चेक किया गया अपवाद बना दें , यदि आपका ग्राहक अपवाद से पुनर्प्राप्त करने के लिए कुछ नहीं कर सकता है, तो उसे बनाएं अनियंत्रित RuntimeException । उदाहरण के लिए, एक RuntimeException एक प्रोग्रामेटिक त्रुटि होगी, जैसे शून्य द्वारा विभाजन, कोई भी उपयोगकर्ता इसके बारे में कुछ भी नहीं कर सकता है, लेकिन प्रोग्रामर स्वयं, तो यह एक RuntimeException है ।
RuntimeException अपवाद कक्षा का एक बच्चा वर्ग है
यह अपवाद कक्षा के कई बच्चे वर्गों में से एक है। RuntimeException उन अपवादों का सुपरक्लास है जिन्हें जावा वर्चुअल मशीन के सामान्य संचालन के दौरान फेंक दिया जा सकता है। किसी विधि को इसके थ्रो में घोषित करने की आवश्यकता नहीं होती है, जो रनटाइम एक्सेप्शन के किसी भी उपवर्ग को रोकती है जिसे विधि के निष्पादन के दौरान फेंक दिया जा सकता है लेकिन पकड़ा नहीं जाता है।
हिचकी है
java.lang.Object
--- java.lang.Throwable
------- java.lang.Exception
------------- java.lang.RuntimeException
अपवाद आपके एप्लिकेशन प्रवाह में अप्रत्याशित घटनाओं को संभालने का एक अच्छा तरीका है। RuntimeException कंपाइलर द्वारा अनियंत्रित हैं लेकिन आप अपने Api क्लाइंट के व्यवहार को नियंत्रित करने के लिए Exception Class का विस्तार करने वाले Exception का उपयोग करना पसंद कर सकते हैं क्योंकि उन्हें संकलन करने के लिए त्रुटियों को पकड़ना आवश्यक है। अच्छे दस्तावेज भी बनाता है।
यदि आपके अनुप्रयोग में विभिन्न प्रकार के अपवाद को उप-वर्ग में रखने के लिए स्वच्छ इंटरफ़ेस का उपयोग वंशानुक्रम प्राप्त करना चाहते हैं और फिर मूल अपवाद को उजागर करें।
दो प्रकार के अपवाद हैं, आप इस तरह के अपवाद को प्राप्त होने पर चेक किए गए अपवाद से पुनर्प्राप्त कर सकते हैं। रनटाइम अपवाद अपूरणीय हैं, रनटाइम अपवाद प्रोग्रामिंग त्रुटियां हैं, और प्रोग्रामर को कोड लिखते समय इसका ध्यान रखना चाहिए, और इसे जारी रखना आपको गलत परिणाम दे सकता है। रनटाइम अपवाद पूर्व शर्त का उल्लंघन करने के बारे में हैं। आपके पास आकार 10 की एक सरणी है, और आप 11 वें तत्व तक पहुंचने की कोशिश कर रहे हैं, यह ArrayIndexOutOfBlException फेंक देगा
उपयोगकर्ता द्वारा परिभाषित अपवाद की जाँच की जा सकती है अपवाद या अनियंत्रित अपवाद, यह उस वर्ग पर निर्भर करता है जिस पर वह विस्तार कर रहा है।
उपयोगकर्ता-निर्धारित अपवाद कस्टम जाँच अपवाद हो सकता है, यदि वह अपवाद वर्ग में विस्तारित हो रहा है
उपयोगकर्ता द्वारा परिभाषित अपवाद कस्टम अनचेक किया गया अपवाद हो सकता है, अगर यह रन समय अपवाद वर्ग तक विस्तारित हो रहा है।
क्लास को परिभाषित करें और इसे अपवाद या रन टाइम अपवाद के लिए एक बच्चा बनाएं