2010-02-03 16 views

उत्तर

105

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

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

+6

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

+2

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

+1

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

36

एक अपवाद की जांच की जाती है, और एक रनटाइम अपवाद अनचेक किया जाता है।

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

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

140

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

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

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

+3

व्यावहारिक रूप से अपने असली है कि "कुछ अपवाद के दो प्रकार हैं" फेंक देते हैं, लेकिन क्यों ओरेकल दस्तावेजों करता है वहाँ तीन प्रकार हैं कहते हैं। यह त्रुटि को तीसरे प्रकार के रूप में मानता है। मुझे लगता है, त्रुटि बिल्कुल अपवाद नहीं है, यह सिर्फ थ्रोबल (ऑब्जेक्ट) है, हाँ, यह रनटाइम अपवादों के व्यवहार की नकल करता है। आप इसके बारे में क्या कहेंगे? ओरेकल डॉक्टर रेफरी। http://docs.oracle.com/javase/tutorial/essential/exceptions/catchOrDeclare.html –

+2

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

+2

लेकिन मजाक RunTimeException स्वयं अपवाद को बढ़ाता है: डी (मुझे पता है कि यह कोई परेशानी नहीं करता है और JVM पूरे संदर्भ का ख्याल रखता है) –

15

रनटाइम अपवाद वर्ग (रनटाइम अपवाद और इसके उप-वर्ग) को संकलन-समय की जांच से छूट दी जाती है, क्योंकि संकलक यह नहीं चला सकता कि रन-टाइम अपवाद नहीं हो सकते हैं। (जेएलएस से)।

वर्गों है कि आप डिजाइन आप अपवाद उपवर्ग है और किसी भी असाधारण स्थितियों का संकेत देने के लिए यह के उदाहरण फेंक चाहिए। ऐसा करने से आप स्पष्ट रूप से अपनी कक्षा के ग्राहकों को संकेत दे रहे होंगे कि आपकी कक्षा का उपयोग अपवाद फेंक सकता है और उन्हें उन असाधारण परिदृश्यों को संभालने के लिए कदम उठाने होंगे।

कोड के टुकड़े नीचे इस बिंदु की व्याख्या:

//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 फेंक सकते हैं, लेकिन विधि घोषणा निर्दिष्ट की जरूरत नहीं है कि फेंक देता है रनटाइम अपवाद

विधि process एक जाँच अपवाद फेंकता है और यह घोषणा करनी चाहिए कि यह तरह MyException की जाँच अपवाद फेंक देते हैं और ऐसा न करने एक संकलन त्रुटि हो जाएगा।

ऊपर वर्ग परिभाषा कोड के रूप में अच्छी प्रक्रिया वर्ग का उपयोग करता है को प्रभावित करेगा।

कॉल new Process().execute() एक वैध आमंत्रण है जहां फॉर्म new Process().process() की कॉल एक संकलन त्रुटि देता है। ऐसा इसलिए है क्योंकि क्लाइंट कोड MyException को संभालने के लिए कदम उठाएं (प्रक्रिया को कॉल करने के लिए कॉल करें) में एक कोशिश/पकड़ ब्लॉक में संलग्न किया जा सकता है)।

66

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 
3

ओरेकल प्रलेखन से:

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

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

अपवादों के साथ

आप यह स्पष्ट रूप से पकड़ने चाहिए क्योंकि आप अभी भी ठीक करने के लिए कुछ कर सकते हैं:

RuntimeExceptions runtimeexceptions के उदाहरण "एक एपीआई के अवैध उपयोग के द्वारा अपवाद" की तरह हैं। अपवाद के उदाहरण हैं: IOException, TimeoutException, PrintException ...

7

Proper use of RuntimeException?

Unchecked Exceptions -- The Controversy से:

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

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

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

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

2

RuntimeException अपवाद वर्ग

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

hierchy ---

java.lang.Object

है java.lang.Throwable

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

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

0

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

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

1

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

0

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

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