के बीच अंतर कोई java.lang.RuntimeException
और java.lang.Exception
के बीच अंतर को समझाएं? अगर मैं अपना अपवाद बनाउंगा तो मैं कैसे तय करूं?java.lang.RuntimeException और java.lang.Exception
उत्तर
आम तौर पर RuntimeExceptionsअपवाद कि प्रोग्राम के रूप में रोका जा सकता है कर रहे हैं। E.g NullPointerException
, ArrayIndexOutOfBoundException
। यदि आप किसी भी विधि को कॉल करने से पहले null
की जांच करते हैं, तो NullPointerException
कभी नहीं होगा। इसी प्रकार ArrayIndexOutOfBoundException
कभी नहीं होगा यदि आप पहले इंडेक्स की जांच करते हैं। RuntimeException
कंपाइलर द्वारा चेक नहीं किया गया है, इसलिए यह साफ कोड है।
EDIT: इन दिनों लोग RuntimeException
का समर्थन करते हैं क्योंकि यह स्वच्छ कोड उत्पन्न करता है। यह पूरी तरह से व्यक्तिगत पसंद है।
एक अपवाद की जांच की जाती है, और एक रनटाइम अपवाद अनचेक किया जाता है।
चेक किया गया है कि कंपाइलर की आवश्यकता है कि आप पकड़ में अपवाद को संभालें, या अपनी विधि को इसे फेंकने के रूप में घोषित करें (या इसके सुपरक्लास)।
आम तौर पर, एक अपवाद अपवाद फेंक दें यदि एपीआई के कॉलर को अपवाद को संभालने की उम्मीद है, और एक अनचेक अपवाद अगर ऐसा कुछ है जो कॉलर सामान्य रूप से संभालने में सक्षम नहीं होता है, जैसे पैरामीटर में से एक त्रुटि , यानी एक प्रोग्रामिंग गलती।
जावा में, दो प्रकार के अपवाद हैं: चेक अपवाद और अन-चेक अपवाद। एक चेक अपवाद को कोड द्वारा स्पष्ट रूप से संभाला जाना चाहिए, जबकि, एक अन-चेक अपवाद को स्पष्ट रूप से संभालने की आवश्यकता नहीं है।
चेक अपवादों के लिए, आपको या तो कोड के चारों ओर एक कोशिश/पकड़ ब्लॉक रखना होगा जो संभावित रूप से अपवाद फेंक सकता है, या विधि में "फेंकता" खंड जोड़ सकता है, यह इंगित करने के लिए कि विधि इस प्रकार के अपवाद को फेंक सकती है (जिसे कॉलिंग क्लास या ऊपर में संभाला जाना चाहिए)।
"अपवाद" से प्राप्त कोई अपवाद एक अपवाद अपवाद है, जबकि RuntimeException से प्राप्त एक वर्ग अन-चेक किया गया है। रनटाइम अपवादों को कॉलिंग कोड द्वारा स्पष्ट रूप से संभालने की आवश्यकता नहीं है।
व्यावहारिक रूप से अपने असली है कि "कुछ अपवाद के दो प्रकार हैं" फेंक देते हैं, लेकिन क्यों ओरेकल दस्तावेजों करता है वहाँ तीन प्रकार हैं कहते हैं। यह त्रुटि को तीसरे प्रकार के रूप में मानता है। मुझे लगता है, त्रुटि बिल्कुल अपवाद नहीं है, यह सिर्फ थ्रोबल (ऑब्जेक्ट) है, हाँ, यह रनटाइम अपवादों के व्यवहार की नकल करता है। आप इसके बारे में क्या कहेंगे? ओरेकल डॉक्टर रेफरी। http://docs.oracle.com/javase/tutorial/essential/exceptions/catchOrDeclare.html –
एक त्रुटि पकड़ा जाने वाला नहीं है (हालांकि यह हो सकता है) आम तौर पर आप अपनी गलतियों को पकड़ने के लिए त्रुटियों का उपयोग करते हैं क्योंकि आप नए काम कर रहे हैं कोड। उदाहरण के लिए यदि आपके पास पेड़ है यदि/elseif कथन, तो अंतिम और फेंक सकता है त्रुटि ("इस स्थिति को होने की उम्मीद नहीं थी"); आम तौर पर बोलते हुए, अपवादों का उन मामलों का उपयोग किया जाता है जहां वे होने के लिए तैयार हैं, जबकि त्रुटियों में उपयोग का कोई मामला नहीं है और वे एक बग हैं। – Danny
लेकिन मजाक RunTimeException स्वयं अपवाद को बढ़ाता है: डी (मुझे पता है कि यह कोई परेशानी नहीं करता है और JVM पूरे संदर्भ का ख्याल रखता है) –
रनटाइम अपवाद वर्ग (रनटाइम अपवाद और इसके उप-वर्ग) को संकलन-समय की जांच से छूट दी जाती है, क्योंकि संकलक यह नहीं चला सकता कि रन-टाइम अपवाद नहीं हो सकते हैं। (जेएलएस से)।
वर्गों है कि आप डिजाइन आप अपवाद उपवर्ग है और किसी भी असाधारण स्थितियों का संकेत देने के लिए यह के उदाहरण फेंक चाहिए। ऐसा करने से आप स्पष्ट रूप से अपनी कक्षा के ग्राहकों को संकेत दे रहे होंगे कि आपकी कक्षा का उपयोग अपवाद फेंक सकता है और उन्हें उन असाधारण परिदृश्यों को संभालने के लिए कदम उठाने होंगे।
कोड के टुकड़े नीचे इस बिंदु की व्याख्या:
//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
को संभालने के लिए कदम उठाएं (प्रक्रिया को कॉल करने के लिए कॉल करें) में एक कोशिश/पकड़ ब्लॉक में संलग्न किया जा सकता है)।
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
ओरेकल प्रलेखन से:
यहाँ लब्बोलुआब यह दिशानिर्देश है: एक ग्राहक यथोचित एक अपवाद से ठीक होने की उम्मीद हो, यह एक जाँच अपवाद कर सकते हैं। यदि कोई ग्राहक अपवाद से पुनर्प्राप्त करने के लिए कुछ भी नहीं कर सकता है, तो इसे अनचेक अपवाद बनाएं।
रनटाइम अपवाद है कि एक प्रोग्रामिंग समस्या का परिणाम है समस्याओं का प्रतिनिधित्व करते हैं और इस तरह के रूप में, API ग्राहक कोड यथोचित उन लोगों से ठीक करने के लिए या उन्हें किसी भी तरह से संभाल करने की उम्मीद नहीं की जा सकती।IllegalStateException, NegativeArraySizeException, NullPointerException
अपवादों के साथआप यह स्पष्ट रूप से पकड़ने चाहिए क्योंकि आप अभी भी ठीक करने के लिए कुछ कर सकते हैं:
RuntimeExceptions runtimeexceptions के उदाहरण "एक एपीआई के अवैध उपयोग के द्वारा अपवाद" की तरह हैं। अपवाद के उदाहरण हैं: IOException, TimeoutException, PrintException ...
Proper use of RuntimeException?
Unchecked Exceptions -- The Controversy से:
एक ग्राहक यथोचित उम्मीद की जा सकती हैं एक अपवाद से उबरने के लिए, यह एक तरह जांच कर ली अपवाद। यदि अपवाद से पुनर्प्राप्त करने के लिए कुछ भी नहीं कर सकता है, तो इसे एक अनचेक अपवाद बनाएं।
कृपया ध्यान दें कि अनियंत्रित अपवाद एक RuntimeException
से ली गई है और एक जाँच अपवाद एक Exception
से ली गई है।
यदि कोई ग्राहक अपवाद से पुनर्प्राप्त करने के लिए कुछ भी नहीं कर सकता है तो RuntimeException
क्यों फेंक दें? लेख में बताया गया:
रनटाइम अपवाद समस्याओं कि एक प्रोग्रामिंग समस्या का परिणाम है प्रतिनिधित्व करते हैं, और इस तरह के रूप में, API ग्राहक कोड यथोचित की उम्मीद नहीं की जा सकती है, उन लोगों से ठीक हो या उन्हें किसी में संभाल करने के लिए मार्ग। ऐसी समस्याओं में अंकगणितीय अपवाद शामिल हैं, जैसे शून्य से विभाजित; सूचक अपवाद, जैसे किसी ऑब्जेक्ट को किसी नल संदर्भ के माध्यम से एक्सेस करने का प्रयास करना; और अनुक्रमण अपवाद, जैसे कि को अनुक्रमणिका के माध्यम से एक सरणी तत्व का उपयोग करना जो बहुत बड़ा या बहुत छोटा है।
RuntimeException अपवाद वर्ग
यह अपवाद वर्ग के कई बच्चे वर्गों में से एक है का एक बच्चा वर्ग है। RuntimeException उन अपवादों का सुपरक्लास है जिसे जावा वर्चुअल मशीन के सामान्य संचालन के दौरान फेंक दिया जा सकता है। RuntimeException के किसी भी उप-वर्ग को फेंकने के लिए किसी विधि को घोषित करने की आवश्यकता नहीं है जिसे विधि के निष्पादन के दौरान फेंक दिया जा सकता है लेकिन पकड़ा नहीं जा सकता है।
hierchy ---
java.lang.Object
है java.lang.Throwable
------- java.lang.Exception
- ----------- java.lang.RuntimeException
अपवाद आपके आवेदन प्रवाह में अप्रत्याशित घटनाओं को संभालने का एक अच्छा तरीका है। RuntimeException को कंपाइलर द्वारा अनचेक किया जाता है लेकिन आप उन अपवादों का उपयोग करना पसंद कर सकते हैं जो आपके एपीआई क्लाइंट के व्यवहार को नियंत्रित करने के लिए अपवाद कक्षा का विस्तार करते हैं क्योंकि उन्हें संकलन करने के लिए त्रुटियों को पकड़ने की आवश्यकता होती है। अच्छा दस्तावेज भी बनाता है।
यदि आपके एप्लिकेशन के विभिन्न प्रकार के अपवाद को उप-वर्गीकृत करने के लिए स्वच्छ इंटरफ़ेस उपयोग विरासत प्राप्त करना चाहते हैं और फिर मूल अपवाद का पर्दाफाश करें।
सरल शब्दों में, अपने ग्राहक/उपयोगकर्ता अपवाद से ठीक हो सकता है, तो यह एक चेक किए गएअपवाद, अपने ग्राहक अपवाद से उबरने के लिए कुछ नहीं कर सकते हैं तो यह अनियंत्रितRuntimeException बनाने। E.g, RuntimeException एक प्रोग्रामेटिक त्रुटि होगी, जैसे शून्य से विभाजन, कोई भी उपयोगकर्ता इसके बारे में कुछ भी नहीं कर सकता है लेकिन प्रोग्रामर स्वयं, तो यह रनटाइम अपवाद है।
दो प्रकार के अपवाद हैं, यदि आप इस तरह के अपवाद प्राप्त करते हैं तो आप चेक अपवाद से पुनर्प्राप्त कर सकते हैं। रनटाइम अपवाद अपरिवर्तनीय है, रनटाइम अपवाद प्रोग्रामिंग त्रुटियां हैं, और प्रोग्रामर को कोड लिखते समय इसका ख्याल रखना चाहिए, और इसके निष्पादन को जारी रखना आपको गलत परिणाम दे सकता है। रनटाइम अपवाद पूर्व शर्त पूर्व का उल्लंघन करने के बारे में हैं। आप आकार 10 की एक सरणी है, और आप का उपयोग 11 वीं तत्व करने की कोशिश कर रहे हैं, यह ArrayIndexOutOfBoundException
- 1. java.lang.RuntimeException Theme.Sherlock
- 2. java.lang.RuntimeException: कैमरा एपीआई
- 3. java.lang.RuntimeException: एसडीके अपडेट
- 4. प्रश्न "java.lang.RuntimeException: java.lang.ClassNotFoundException:"
- 5. java.lang.RuntimeException: सिस्टम सर्वर मृत?
- 6. यह त्रुटि क्यों हुई? java.lang.RuntimeException:
- 7. java.lang.Exception: पहले से ही कंसोल पर उपयोग
- 8. keytool त्रुटि: java.lang.Exception: इनपुट X.509 प्रमाणपत्र
- 9. java.lang.Exception बनाम अपना खुद का अपवाद रोलिंग
- 10. java.lang.RuntimeException: Wakelock तहत बंद कर दिया C2DM_LIB
- 11. कस्टम अधिसूचना: java.lang.RuntimeException: खराब सरणी लंबाई
- 12. java.lang.Exception: इनपुट नहीं एक 509 प्रमाणपत्र: Keytool त्रुटि
- 13. java.lang.RuntimeException: कैमरा सेवा से कनेक्ट करने में विफल
- 14. java.lang.RuntimeException: त्रुटि: भ्रष्ट कैश प्रविष्टि पुनर्प्राप्त करने में विफल
- 15. त्रुटि java.lang.RuntimeException: स्टब! फिटनेस परीक्षण के साथ एंड्रॉइड में
- 16. java.lang.RuntimeException: कोई त्रुटि doInBackground निष्पादित करते समय हुई()
- 17. java.lang.RuntimeException: परिणाम देने में विफलता RESultInfo {who = null, request = 1, परिणाम = -1, डेटा = इराद} गतिविधि
- 18. ग्रहण उत्पाद आमंत्रण java.lang.RuntimeException का कारण बनता है: कोई एप्लिकेशन आईडी नहीं मिली है
- 19. java.lang.RuntimeException: धागा कि Looper.prepare आह्वान नहीं किया अंदर हैंडलर नहीं बनाया जा सकता()
- 20. मैं गेब और स्पॉक
- 21. जुनीट और junit.framework.TestSuite - कोई रनने योग्य विधियां
- 22. सेलेनियम, PHPUnit, और AttachFile()
- 23. क्या मैं परमाणु का उपयोग कर रहा हूं? गलत या कुछ और है ....?
- 24. "थ्रेड.current थ्रेड()। GetName" और "this.getName" के बीच क्या अंतर है?
- 25. जुनीट और जेडीके
- 26. AsyncTask और Looper.prepare() त्रुटि
- 27. स्प्रिंग एमवीसी 3.1+ WebApplicationInitializer का प्रयोग सत्र-कॉन्फ़िगरेशन और त्रुटि-पृष्ठ
- 28. वेग में त्रुटि और log4J
- 29. क्लोजर फ़ंक्शन
- 30. पायथन में अपवाद कैसे प्राप्त करें और अपवाद का संदर्भ प्राप्त करें, प्रकार जानने के बिना?
मुझे इस कोण को पसंद है "कॉलर द्वारा रनटाइम अपवादों से बचा जा सकता था"। इसका मतलब है कि आप (एक विधि के कॉलर के रूप में) यह सुनिश्चित करना चाहते हैं कि वे भी न हों। जबकि चेक अपवाद कुछ ऐसा है जो आप टालना नहीं कर सकते हैं और इसके बजाय तथ्य के बाद उनसे निपटने के लिए आवश्यक हैं। (और हां, चूंकि सभी चेक अपवादों की अवधारणा से सहमत नहीं हैं और कई लोग सबकुछ के लिए रनटाइम अपवाद का उपयोग करते हैं, यह भेद थोड़ा उलझ गया है)। – Thilo
आजकल लोग अनचेक रनटाइम अपवाद का भी पक्ष लेते हैं, क्योंकि यह जावा 8 लैम्ब्डा प्रोसेसिंग के अनुकूल है, जबकि टाइप अपवाद के चेक अपवाद नहीं हैं। – Hartmut
मुझे संदेह है कि लोगों को 'रनटाइम अपवाद' पकड़ने का असली कारण यह है कि यह आसान है, और चेक किए गए और अनचेक अपवादों के बीच अंतरों के बारे में सोचने की आवश्यकता को रोकता है। मुझे लगता है कि रनटाइम अपवादों को पकड़ना एक भयानक विचार है क्योंकि आप 'NullPointerException' जैसे अप्राप्य अपवादों को पकड़ लेंगे। –