Java.lang.RuntimeException और java.lang.Exception के बीच अंतर


210

कृपया किसी java.lang.RuntimeExceptionऔर के बीच अंतर स्पष्ट करें java.lang.Exception? यदि मैं अपना स्वयं का अपवाद बनाता हूं, तो मैं यह कैसे तय करूं कि किसको बढ़ाया जाए?

जवाबों:


181

आम तौर पर RuntimeExceptions हैं अपवाद है कि प्रोग्राम के रूप में रोका जा सकता है। उदाहरण के लिए NullPointerException, ArrayIndexOutOfBoundException। यदि आप nullकिसी भी तरीके को कॉल करने से पहले जांचते हैं, NullPointerExceptionतो कभी नहीं होगा। ArrayIndexOutOfBoundExceptionयदि आप पहले सूचकांक की जाँच करते हैं तो इसी तरह कभी नहीं होगा। RuntimeExceptionसंकलक द्वारा जांच नहीं की जाती है, इसलिए यह साफ कोड है।

EDIT : इन दिनों लोग इसके पक्ष में हैं RuntimeExceptionक्योंकि यह साफ कोड का उत्पादन करता है। यह पूरी तरह से एक व्यक्तिगत पसंद है।


10
मुझे यह पसंद है कि "रनटाइम अपवादों को कॉलर द्वारा टाला जा सकता था"। इसका मतलब है कि आप (एक विधि के कॉलर के रूप में) यह सुनिश्चित करने के लिए चाहिए कि वे भी नहीं होते हैं। जबकि जाँच किए गए अपवाद कुछ ऐसे हैं जिनसे आप बच नहीं सकते हैं और इस तथ्य के बाद उनसे निपटने के लिए आवश्यक हैं। (और हां, चूंकि हर कोई चेक किए गए अपवादों की अवधारणा से सहमत नहीं है और बहुत से लोग हर चीज के लिए RuntimeException का उपयोग करते हैं, यह भेद थोड़ा सा हो गया है)।
थिलो

4
आजकल लोग अनियंत्रित RuntimeException का भी पक्ष लेते हैं, क्योंकि यह Java 8 लेम्बडा प्रोसेसिंग के अनुकूल है, जबकि टाइप अपवाद के चेक किए गए अपवाद अपवाद नहीं हैं।
हार्टमट पी।

2
मुझे संदेह है कि लोग वास्तविक कारण को पकड़ते हैं RuntimeExceptionक्योंकि यह सरल है, और चेक किए गए और अनियंत्रित अपवादों के बीच के अंतर के बारे में सोचने की आवश्यकता को कम करता है। मुझे लगता है कि रनटाइम अपवादों को पकड़ना एक भयानक विचार है क्योंकि आप इस तरह के अपरिवर्तनीय अपवादों को पकड़ लेंगे NullPointerException
डोनल

186

जावा में, दो प्रकार के अपवाद हैं: चेक किए गए अपवाद और अन-चेक किए गए अपवाद। एक चेक किए गए अपवाद को कोड द्वारा स्पष्ट रूप से नियंत्रित किया जाना चाहिए, जबकि, एक अन-चेक किए गए अपवाद को स्पष्ट रूप से नियंत्रित करने की आवश्यकता नहीं है।

चेक किए गए अपवादों के लिए, आपको या तो कोड के चारों ओर एक कोशिश / कैच ब्लॉक डालना होगा जो संभावित रूप से अपवाद को फेंक सकता है, या विधि में "थ्रो" क्लॉज जोड़ सकता है, यह इंगित करने के लिए कि विधि इस प्रकार के अपवाद को फेंक सकती है (जो होना चाहिए) कॉलिंग क्लास या उससे ऊपर) में संभाला।

कोई अपवाद जो "अपवाद" से उत्पन्न होता है, एक जाँच अपवाद है, जबकि एक वर्ग जो RuntimeException से प्राप्त होता है, संयुक्त राष्ट्र का जाँच है। RuntimeException को कॉलिंग कोड द्वारा स्पष्ट रूप से नियंत्रित करने की आवश्यकता नहीं है।


3
व्यावहारिक रूप से यह सच है कि "दो प्रकार के अपवाद हैं", लेकिन क्यों ओरेकल दस्तावेज़ कहते हैं कि तीन प्रकार हैं। यह एरर को 3rd टाइप मानता है। मुझे लगता है, त्रुटि बिल्कुल एक अपवाद नहीं है, इसका सिर्फ थ्रोएबल (ऑब्जेक्ट), हाँ, यह रनटाइम अपवादों के व्यवहार की नकल करता है। आप इसके बारे में क्या कहेंगे? ओरेकल डॉक। संदर्भ। docs.oracle.com/javase/tutorial/essential/exception/…
आसिफ शहजाद

3
एक त्रुटि को पकड़ने के लिए नहीं है (हालांकि यह हो सकता है) आम तौर पर आप अपनी गलतियों को पकड़ने के लिए त्रुटियों का उपयोग करते हैं क्योंकि आप नए कोड पर काम कर रहे हैं। उदाहरण के लिए यदि आपके पास एक पेड़ है यदि / ifif कथन, तो अंतिम रूप से त्रुटि हो सकती है ("ऐसा होने की उम्मीद नहीं कर रहा है") ;। सामान्यतया, अपवादों में ऐसे मामलों का उपयोग किया जाता है जहां वे होने होते हैं, जबकि त्रुटियों का उपयोग मामला नहीं होता है और वे एक बग होते हैं।
डैनी

5
लेकिन मजाक रनटाइम एक्ससेप्शन ही होता है। अपवाद: डी (मुझे पता है कि इससे कोई परेशानी नहीं होती है और जेवीएम पूरे संदर्भ का ख्याल रखता है)
अलिरेज़ा मोहम्मदी

94

वर्गों 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 

47

एक अपवाद की जाँच की जाती है, और एक RuntimeException अनियंत्रित है।

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

आम तौर पर, अगर एपीआई का कॉलर अपवाद को संभालने के लिए अपेक्षित है, और एक अनियंत्रित अपवाद, अगर यह ऐसा कुछ है, जिसे कॉल करने वाला व्यक्ति सामान्य रूप से संभाल नहीं पाएगा, जैसे कि मापदंडों में से एक, यानी प्रोग्रामिंग के साथ एक अपवादित अपवाद को फेंक दें। गलती।


15

रनटाइम अपवाद वर्ग (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(कहते हैं कि कॉल टू प्रोसेस () कोशिश / कैच ब्लॉक में संलग्न किया जा सकता है)।


13

RuntimeException का उचित उपयोग?

से अनियंत्रित अपवाद - विवाद :

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

ध्यान दें कि एक अनियंत्रित अपवाद एक से लिया गया है RuntimeExceptionऔर एक चेक किया गया अपवाद एक से निकला है Exception

RuntimeExceptionअगर एक ग्राहक अपवाद से उबरने के लिए कुछ नहीं कर सकता है तो क्यों फेंकें ? लेख बताता है:

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


5

ओरेकल दस्तावेज से:

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

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

रनटाइमएक्सपेक्टेशन के उदाहरणों के अनुसार "रन के अपवादों को अवैध उपयोग द्वारा अपवाद" की तरह हैं: अवैधस्टैटेस्ट अपवाद, नेगेटिवअप्रेशनइसेप्शन, NullpointerException

अपवादों के साथ आपको इसे स्पष्ट रूप से पकड़ना चाहिए क्योंकि आप अभी भी पुनर्प्राप्त करने के लिए कुछ कर सकते हैं। अपवाद के उदाहरण हैं: IOException, TimeoutException, PrintException ...


4

सरल शब्दों में, यदि आपका क्लाइंट / उपयोगकर्ता अपवाद से पुनर्प्राप्त कर सकता है, तो इसे एक चेक किया गया अपवाद बना दें , यदि आपका ग्राहक अपवाद से पुनर्प्राप्त करने के लिए कुछ नहीं कर सकता है, तो उसे बनाएं अनियंत्रित RuntimeException । उदाहरण के लिए, एक RuntimeException एक प्रोग्रामेटिक त्रुटि होगी, जैसे शून्य द्वारा विभाजन, कोई भी उपयोगकर्ता इसके बारे में कुछ भी नहीं कर सकता है, लेकिन प्रोग्रामर स्वयं, तो यह एक RuntimeException है


3

RuntimeException अपवाद कक्षा का एक बच्चा वर्ग है

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

हिचकी है

java.lang.Object

--- java.lang.Throwable

------- java.lang.Exception

------------- java.lang.RuntimeException


0

अपवाद आपके एप्लिकेशन प्रवाह में अप्रत्याशित घटनाओं को संभालने का एक अच्छा तरीका है। RuntimeException कंपाइलर द्वारा अनियंत्रित हैं लेकिन आप अपने Api क्लाइंट के व्यवहार को नियंत्रित करने के लिए Exception Class का विस्तार करने वाले Exception का उपयोग करना पसंद कर सकते हैं क्योंकि उन्हें संकलन करने के लिए त्रुटियों को पकड़ना आवश्यक है। अच्छे दस्तावेज भी बनाता है।

यदि आपके अनुप्रयोग में विभिन्न प्रकार के अपवाद को उप-वर्ग में रखने के लिए स्वच्छ इंटरफ़ेस का उपयोग वंशानुक्रम प्राप्त करना चाहते हैं और फिर मूल अपवाद को उजागर करें।


0

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


0
  1. उपयोगकर्ता द्वारा परिभाषित अपवाद की जाँच की जा सकती है अपवाद या अनियंत्रित अपवाद, यह उस वर्ग पर निर्भर करता है जिस पर वह विस्तार कर रहा है।

  2. उपयोगकर्ता-निर्धारित अपवाद कस्टम जाँच अपवाद हो सकता है, यदि वह अपवाद वर्ग में विस्तारित हो रहा है

  3. उपयोगकर्ता द्वारा परिभाषित अपवाद कस्टम अनचेक किया गया अपवाद हो सकता है, अगर यह रन समय अपवाद वर्ग तक विस्तारित हो रहा है।

  4. क्लास को परिभाषित करें और इसे अपवाद या रन टाइम अपवाद के लिए एक बच्चा बनाएं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.