मैं मूल जावा और विभिन्न प्रकार के थ्रोबेबल्स के बारे में अधिक जानने की कोशिश कर रहा हूं, क्या कोई मुझे अपवाद और त्रुटियों के बीच के अंतर को बता सकता है?
मैं मूल जावा और विभिन्न प्रकार के थ्रोबेबल्स के बारे में अधिक जानने की कोशिश कर रहा हूं, क्या कोई मुझे अपवाद और त्रुटियों के बीच के अंतर को बता सकता है?
जवाबों:
त्रुटियों को पकड़ा या संभाला नहीं जाना चाहिए (मामलों के दुर्लभ मामलों को छोड़कर)। अपवाद अपवाद हैंडलिंग की रोटी और मक्खन हैं। जावाडोक यह अच्छी तरह से बताते हैं:
एक त्रुटि थ्रोबल का एक उपवर्ग है जो गंभीर समस्याओं को इंगित करता है कि एक उचित अनुप्रयोग को पकड़ने की कोशिश नहीं करनी चाहिए। अधिकांश ऐसी त्रुटियां असामान्य स्थिति हैं।
कुछ उपवर्गों में देखिए Error
, उनके कुछ JavaDoc कमेंट्स:
AnnotationFormatError
- जब एनोटेशन पार्सर एक क्लास फ़ाइल से एनोटेशन पढ़ने का प्रयास करता है, तो फेंका जाता है और निर्धारित करता है कि एनोटेशन विकृत है।AssertionError
- यह इंगित करने के लिए फेंक दें कि एक दावा विफल हो गया है।LinkageError
- लिंकेज के उपवर्गों से पता चलता है कि एक वर्ग का दूसरे वर्ग पर कुछ निर्भरता है; हालाँकि, बाद वाला वर्ग पूर्व वर्ग के संकलन के बाद असंगत रूप से बदल गया है।VirtualMachineError
- यह इंगित करने के लिए कि जावा वर्चुअल मशीन टूट गई है या ऑपरेटिंग जारी रखने के लिए आवश्यक संसाधनों से बाहर चला गया है। वास्तव में तीन महत्वपूर्ण उपश्रेणियाँ हैं Throwable
:
Error
- कुछ गंभीर पर्याप्त गलत हो गया है सबसे अनुप्रयोगों को समस्या को संभालने की कोशिश करने के बजाय दुर्घटनाग्रस्त होना चाहिए,RuntimeException
) - अक्सर एक प्रोग्रामिंग त्रुटि जैसे कि NullPointerException
या एक अवैध तर्क। एप्लिकेशन कभी-कभी इस Throwable
श्रेणी से हैंडल या पुनर्प्राप्त कर सकते हैं - या कम से कम इसे थ्रेड की run()
विधि पर पकड़ सकते हैं , शिकायत लॉग कर सकते हैं, और जारी रख सकते हैं।FileNotFoundException
और TimeoutException
...यह स्लाइड @ जार्जियो-गूसियो द्वारा जावा के अपवाद पदानुक्रम को स्पष्ट रूप से जावा में त्रुटियों और अपवादों के बीच अंतर को बताती है।
जैसा कि आप जानते हैं कि त्रुटियां आपके आवेदन के अंत का संकेत देती हैं। यह आमतौर पर से पुनर्प्राप्त नहीं किया जा सकता है और आपके वीएम से बाहर निकलने का कारण होना चाहिए। बाहर निकलने से पहले संभवतः लॉग या डिस्प्ले और उपयुक्त संदेश को छोड़कर उन्हें पकड़ना नहीं चाहिए।
उदाहरण: OutOfMemoryError - जैसा कि आपका प्रोग्राम अब नहीं चल सकता है उतना आप नहीं कर सकते।
अपवाद अक्सर पुनर्प्राप्त करने योग्य होते हैं और तब भी नहीं होते हैं, जब वे आम तौर पर केवल एक प्रयास किए गए ऑपरेशन को विफल करते हैं, लेकिन आपका कार्यक्रम अभी भी जारी रह सकता है।
उदाहरण: IllegalArgumentException - एक विधि से अमान्य डेटा पारित किया ताकि विधि कॉल विफल हो जाए, लेकिन यह भविष्य के संचालन को प्रभावित नहीं करता है।
ये सरल उदाहरण हैं, और केवल अपवाद पर जानकारी का एक और धन है।
Error
जावा में s प्रकार के होते हैं java.lang.Error
।Error
रन टाइम पर होता है। उन्हें संकलक के लिए नहीं जाना जाएगा। Error
s अधिकतर उस वातावरण के कारण होता है जिसमें अनुप्रयोग चल रहा है। java.lang.StackOverflowError
,java.lang.OutOfMemoryError
अपवाद -
Exception
जावा में s प्रकार के होते हैं java.lang.Exception
।Exception
s दोनों की जाँच के साथ ही अनियंत्रित प्रकार भी शामिल है।try-catch
ब्लॉकों के माध्यम से संभालकर अपवादों से उबर सकते हैं ।Exception
s मुख्य रूप से एप्लिकेशन के कारण ही होता है।SQLException
, IOException
ArrayIndexOutOfBoundException
, ClassCastException
,NullPointerException
आगे पढ़े: http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/
सूर्य इसे सबसे अच्छा रखता है :
एक त्रुटि थ्रोबल का एक उपवर्ग है जो गंभीर समस्याओं को इंगित करता है कि एक उचित अनुप्रयोग को पकड़ने की कोशिश नहीं करनी चाहिए।
Error
कक्षा का विवरण काफी स्पष्ट है:
इसका
Error
एक उपवर्गThrowable
गंभीर समस्याओं को इंगित करता है जो एक उचित अनुप्रयोग को पकड़ने की कोशिश नहीं करनी चाहिए। अधिकांश ऐसी त्रुटियां असामान्य स्थिति हैं।ThreadDeath
हालांकि, "सामान्य" स्थिति की त्रुटि भी एक उपवर्ग है,Error
क्योंकि अधिकांश अनुप्रयोगों को इसे पकड़ने की कोशिश नहीं करनी चाहिए।इसके थ्रो क्लाज को घोषित करने के लिए एक विधि की आवश्यकता नहीं होती है
Error
, जो विधि के निष्पादन के दौरान किसी भी उपवर्ग को फेंकी जा सकती है लेकिन इसे पकड़ा नहीं जाता है, क्योंकि ये त्रुटियां असामान्य स्थितियां हैं जो कभी नहीं होनी चाहिए।
जावा के वर्गError
के स्वयं के प्रलेखन से उद्धृत ।
संक्षेप में, आपको एस को नहीं पकड़ना चाहिए Error
, इसके अलावा आपके पास ऐसा करने का एक अच्छा कारण है। (उदाहरण के लिए वेब सर्वर के अपने कार्यान्वयन को रोकने के लिए अगर कोई सर्वलेट मेमोरी से बाहर निकलता है या ऐसा कुछ होता है।)
Exception
दूसरी ओर, एन किसी अन्य आधुनिक भाषा की तरह ही एक सामान्य अपवाद है। आपको जावा एपीआई प्रलेखन या किसी भी ऑनलाइन या ऑफलाइन संसाधन में विस्तृत विवरण मिलेगा।
वर्गों java.lang.Exception
और के बीच कई समानताएं और अंतर हैं java.lang.Error
।
समानता:
सबसे पहले - दोनों वर्गों का विस्तार java.lang.Throwable
और तरीकों जो आम हैं के कई inherits एक परिणाम के रूप में जब इस तरह के रूप त्रुटियों के साथ काम करने के लिए इस्तेमाल किया जा: getMessage
, getStackTrace
, printStackTrace
और इतने पर।
दूसरा, java.lang.Throwable
उन दोनों के उपवर्गों के रूप में निम्नलिखित गुण विरासत में मिले:
थ्रोबल खुद और इसके किसी भी उपवर्ग (सहित java.lang.Error
) को throws
कीवर्ड का उपयोग करके विधि अपवाद सूची में घोषित किया जा सकता है । इस तरह की घोषणा केवल के लिए आवश्यक java.lang.Exception
और उपवर्गों, के लिए java.lang.Throwable
, java.lang.Error
और java.lang.RuntimeException
और उनके उपवर्गों यह वैकल्पिक है।
खंड java.lang.Throwable
में केवल और उपवर्गों का उपयोग करने की अनुमति दी गई है catch
।
केवल java.lang.Throwable
और उपवर्गों कीवर्ड के साथ किया जा सकता है - throw
।
इस संपत्ति से निष्कर्ष दोनों का अनुसरण कर रहा है java.lang.Error
और java.lang.Exception
विधि शीर्ष लेख में घोषित किया जा सकता है, catch
खंड में हो सकता है, कीवर्ड के साथ उपयोग किया जा सकता है throw
।
अंतर:
पहला - वैचारिक अंतर: java.lang.Error
जेवीएम द्वारा फेंका जाना और गंभीर समस्याओं का संकेत देना और पकड़े जाने के बजाय कार्यक्रम के निष्पादन को रोकना है (लेकिन यह किसी अन्य java.lang.Throwable
उत्तराधिकारी के लिए संभव है )।
के बारे में javadoc विवरण से एक मार्ग java.lang.Error
:
... गंभीर समस्याओं को इंगित करता है कि एक उचित अनुप्रयोग को पकड़ने की कोशिश नहीं करनी चाहिए।
विपरीत java.lang.Exception
त्रुटियों का प्रतिनिधित्व करने के लिए डिज़ाइन किया गया है और प्रोग्राम निष्पादन समाप्त किए बिना प्रोग्रामर द्वारा नियंत्रित किया जा सकता है।
के बारे में javadoc विवरण से एक मार्ग java.lang.Exception
:
... उन स्थितियों को इंगित करता है जो एक उचित एप्लिकेशन को पकड़ना चाहते हैं।
java.lang.Error
और java.lang.Exception
पहले अंतर संकलन अपवाद की जाँच के लिए एक अनियंत्रित अपवाद माना जाता है । परिणाम कोड को फेंकने java.lang.Error
या उसके उप-वर्ग के लिए विधि शीर्षलेख में इस त्रुटि को घोषित करने की आवश्यकता नहीं है। java.lang.Exception
विधि हेडर में आवश्यक घोषणा फेंकते समय ।थ्रोएबल और उसके उत्तराधिकारी वर्ग आरेख (गुण और विधियां छोड़ दी जाती हैं)।
IMO एक त्रुटि एक ऐसी चीज है जो आपके आवेदन को विफल कर सकती है और इसे नियंत्रित नहीं किया जाना चाहिए। एक अपवाद कुछ ऐसा है जो अप्रत्याशित परिणाम दे सकता है, लेकिन इससे पुनर्प्राप्त किया जा सकता है।
उदाहरण:
यदि प्रोग्राम मेमोरी से बाहर चला गया है तो यह एक त्रुटि है क्योंकि एप्लिकेशन जारी नहीं रह सकता है। हालाँकि, यदि कोई प्रोग्राम गलत इनपुट प्रकार स्वीकार करता है तो यह एक अपवाद है क्योंकि प्रोग्राम इसे हैंडल कर सकता है और सही इनपुट प्रकार प्राप्त करने के लिए रीडायरेक्ट कर सकता है।
त्रुटियां मुख्य रूप से उस वातावरण के कारण होती हैं जिसमें अनुप्रयोग चल रहा है। उदाहरण के लिए, OutOfMemoryError तब होता है जब JVM मेमोरी से बाहर निकलता है या StackOverflowError तब होता है जब स्टैक ओवरफ्लो होता है।
अपवाद मुख्य रूप से आवेदन के कारण ही होते हैं। उदाहरण के लिए, NullPointerException तब होती है जब कोई एप्लिकेशन अशक्त वस्तु तक पहुंचने का प्रयास करता है या ClassCastException तब होता है जब कोई एप्लिकेशन असंगत वर्ग प्रकारों को डालने का प्रयास करता है।
यहाँ जावा एपीआई से एक बहुत अच्छा सारांश है जो एक त्रुटि और अपवाद का प्रतिनिधित्व करता है:
एक त्रुटि थ्रोबल का एक उपवर्ग है जो गंभीर समस्याओं को इंगित करता है कि एक उचित अनुप्रयोग को पकड़ने की कोशिश नहीं करनी चाहिए। अधिकांश ऐसी त्रुटियां असामान्य स्थिति हैं। थ्रेड-डाउन त्रुटि, हालांकि "सामान्य" स्थिति है, यह भी त्रुटि का एक उपवर्ग है, क्योंकि अधिकांश अनुप्रयोगों को इसे पकड़ने की कोशिश नहीं करनी चाहिए।
किसी विधि को इसके थ्रो में घोषित करने की आवश्यकता नहीं है, जो कि त्रुटि के किसी भी उपवर्ग को रोकती है, जो विधि के निष्पादन के दौरान फेंक दी जा सकती है लेकिन पकड़ी नहीं जाती है, क्योंकि ये त्रुटियां असामान्य स्थितियां हैं जो कभी नहीं होनी चाहिए।
अपवाद के लिए OTOH, Java API कहता है:
क्लास एक्सेप्शन और उसके उपवर्ग थ्रोबल का एक रूप है जो उन स्थितियों को इंगित करता है जो एक उचित एप्लिकेशन को पकड़ना चाहते हैं।
त्रुटियां उस वातावरण के कारण होती हैं जहां आपका एप्लिकेशन या प्रोग्राम चलता है। ज्यादातर बार, आप इससे उबर नहीं सकते हैं क्योंकि इससे आपका एप्लिकेशन या प्रोग्राम समाप्त हो जाता है। जावदोक ने सलाह दी कि आपको इस तरह की त्रुटियों को पकड़ने की जहमत नहीं उठानी चाहिए क्योंकि पर्यावरण जैसे जेवीएम, इस तरह की त्रुटियों को वैसे भी छोड़ने जा रहा है।
उदाहरण:
VirtualMachineError
- यह इंगित करने के लिए कि जावा वर्चुअल मशीन टूट गई है या ऑपरेटिंग जारी रखने के लिए आवश्यक संसाधनों से बाहर चला गया है।
OutOfMemoryError
तब होता है जब JVM मेमोरी से बाहर निकलता है या
StackOverflowError
तब होता है जब स्टैक ओवर चलता है।
अपवाद आपके आवेदन या कार्यक्रम के कारण ही होते हैं; शायद अपनी गलती के कारण। ज्यादातर बार आप इससे उबर सकते हैं और आपका आवेदन अभी भी चलता रहेगा। आपको अपने एप्लिकेशन या प्रोग्राम की असामान्य समाप्ति को रोकने और / या अपवाद संदेश को अनुकूलित करने में सक्षम होने के लिए ऐसी त्रुटियों को पकड़ने की सलाह दी जाती है ताकि उपयोगकर्ता डिफ़ॉल्ट रूप से बदसूरत अपवाद संदेशों के बजाय सभी जगह एक बिखरे हुए संदेश को देखें।
उदाहरण:
NullPointerException
तब होता है जब कोई एप्लिकेशन अशक्त वस्तु तक पहुंचने की कोशिश करता है। या गैर-मौजूदा सूचकांक के साथ एक सरणी तक पहुंचने या गलत डेटा या पैरामीटर के साथ फ़ंक्शन को कॉल करने का प्रयास करना।
Unchecked exceptions != RuntimeExceptions
;Unchecked exceptions = RuntimeExceptions + Errors
। मुझे पता है कि यह सवाल उठाता है: क्या त्रुटि अपवाद है? , लेकिन यह वही है जो वे लिखते हैं। यहाँ उन उदाहरणों में से एक है: docs.oracle.com/javase/tutorial/essential/exception/… ।