अपवाद और त्रुटि के बीच अंतर


173

मैं मूल जावा और विभिन्न प्रकार के थ्रोबेबल्स के बारे में अधिक जानने की कोशिश कर रहा हूं, क्या कोई मुझे अपवाद और त्रुटियों के बीच के अंतर को बता सकता है?

जवाबों:


178

त्रुटियों को पकड़ा या संभाला नहीं जाना चाहिए (मामलों के दुर्लभ मामलों को छोड़कर)। अपवाद अपवाद हैंडलिंग की रोटी और मक्खन हैं। जावाडोक यह अच्छी तरह से बताते हैं:

एक त्रुटि थ्रोबल का एक उपवर्ग है जो गंभीर समस्याओं को इंगित करता है कि एक उचित अनुप्रयोग को पकड़ने की कोशिश नहीं करनी चाहिए। अधिकांश ऐसी त्रुटियां असामान्य स्थिति हैं।

कुछ उपवर्गों में देखिए Error, उनके कुछ JavaDoc कमेंट्स:

  • AnnotationFormatError - जब एनोटेशन पार्सर एक क्लास फ़ाइल से एनोटेशन पढ़ने का प्रयास करता है, तो फेंका जाता है और निर्धारित करता है कि एनोटेशन विकृत है।
  • AssertionError - यह इंगित करने के लिए फेंक दें कि एक दावा विफल हो गया है।
  • LinkageError- लिंकेज के उपवर्गों से पता चलता है कि एक वर्ग का दूसरे वर्ग पर कुछ निर्भरता है; हालाँकि, बाद वाला वर्ग पूर्व वर्ग के संकलन के बाद असंगत रूप से बदल गया है।
  • VirtualMachineError - यह इंगित करने के लिए कि जावा वर्चुअल मशीन टूट गई है या ऑपरेटिंग जारी रखने के लिए आवश्यक संसाधनों से बाहर चला गया है।

वास्तव में तीन महत्वपूर्ण उपश्रेणियाँ हैं Throwable:

  • Error - कुछ गंभीर पर्याप्त गलत हो गया है सबसे अनुप्रयोगों को समस्या को संभालने की कोशिश करने के बजाय दुर्घटनाग्रस्त होना चाहिए,
  • अनियंत्रित अपवाद (उर्फ RuntimeException) - अक्सर एक प्रोग्रामिंग त्रुटि जैसे कि NullPointerExceptionया एक अवैध तर्क। एप्लिकेशन कभी-कभी इस Throwableश्रेणी से हैंडल या पुनर्प्राप्त कर सकते हैं - या कम से कम इसे थ्रेड की run()विधि पर पकड़ सकते हैं , शिकायत लॉग कर सकते हैं, और जारी रख सकते हैं।
  • चेक किए गए अपवाद (बाकी सब कुछ उर्फ) - अनुप्रयोग जैसे पकड़ने और सार्थक बाकी के साथ कुछ करने के लिए, सक्षम होने के लिए उम्मीद कर रहे हैं FileNotFoundExceptionऔर TimeoutException...

10
ओरेकल कहता है कि Unchecked exceptions != RuntimeExceptions; Unchecked exceptions = RuntimeExceptions + Errors। मुझे पता है कि यह सवाल उठाता है: क्या त्रुटि अपवाद है? , लेकिन यह वही है जो वे लिखते हैं। यहाँ उन उदाहरणों में से एक है: docs.oracle.com/javase/tutorial/essential/exception/…
ROMANIA_engineer

1
अनुत्तरित प्रश्न यह है कि मूल रूप में RuntimeException और Error अलग कैसे हैं? दोनों ही अनियंत्रित और हर दूसरे तरीके से बराबर हैं।
पचेरियर

38

यह स्लाइड @ जार्जियो-गूसियो द्वारा जावा के अपवाद पदानुक्रम को स्पष्ट रूप से जावा में त्रुटियों और अपवादों के बीच अंतर को बताती है।

जावा अपवाद पदानुक्रम


6
मैं किसी को NullPointerException से उबरते हुए देखना पसंद करूंगा: D: D: D
इग्नासियो सोलर गार्सिया

2
@IgnacioSolerGarcia यह हो सकता है और यहां तक ​​कि इसका अर्थ है (अन्य प्रश्न यदि यह अच्छा है)। आम तौर पर आप जांचते हैं कि ऑब्जेक्ट मौजूद है और उसके बाद विधि को कॉल करें या फ़ील्ड का उपयोग करें। लेकिन आप अस्तित्व के लिए जाँच करने के बजाय एनपीई को पकड़ने की कोशिश कर सकते हैं। और इसके बारे में एक संदेश लॉग ऑन करें और उदाहरण के लिए, पर जाएं।
गंगनुस

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

17

जैसा कि आप जानते हैं कि त्रुटियां आपके आवेदन के अंत का संकेत देती हैं। यह आमतौर पर से पुनर्प्राप्त नहीं किया जा सकता है और आपके वीएम से बाहर निकलने का कारण होना चाहिए। बाहर निकलने से पहले संभवतः लॉग या डिस्प्ले और उपयुक्त संदेश को छोड़कर उन्हें पकड़ना नहीं चाहिए।

उदाहरण: OutOfMemoryError - जैसा कि आपका प्रोग्राम अब नहीं चल सकता है उतना आप नहीं कर सकते।

अपवाद अक्सर पुनर्प्राप्त करने योग्य होते हैं और तब भी नहीं होते हैं, जब वे आम तौर पर केवल एक प्रयास किए गए ऑपरेशन को विफल करते हैं, लेकिन आपका कार्यक्रम अभी भी जारी रह सकता है।

उदाहरण: IllegalArgumentException - एक विधि से अमान्य डेटा पारित किया ताकि विधि कॉल विफल हो जाए, लेकिन यह भविष्य के संचालन को प्रभावित नहीं करता है।

ये सरल उदाहरण हैं, और केवल अपवाद पर जानकारी का एक और धन है।


उदाहरण देखें। javacodegeeks.com/java-basics/exception/… उदाहरण के रूप में। IllegalArgumentException रनटाइम अपवाद है, त्रुटि नहीं। docs.oracle.com/javase/7/docs/api/java/lang/…
गंगनुस

8

त्रुटियां -

  1. Errorजावा में s प्रकार के होते हैं java.lang.Error
  2. जावा में सभी त्रुटियाँ अनियंत्रित प्रकार हैं।
  3. Errorरन टाइम पर होता है। उन्हें संकलक के लिए नहीं जाना जाएगा।
  4. त्रुटियों से उबरना असंभव है।
  5. Errors अधिकतर उस वातावरण के कारण होता है जिसमें अनुप्रयोग चल रहा है।
  6. उदाहरण: java.lang.StackOverflowError ,java.lang.OutOfMemoryError

अपवाद -

  1. Exceptionजावा में s प्रकार के होते हैं java.lang.Exception
  2. Exceptions दोनों की जाँच के साथ ही अनियंत्रित प्रकार भी शामिल है।
  3. जाँच किए गए अपवाद संकलक के लिए जाने जाते हैं जहाँ अनियंत्रित अपवाद संकलक के लिए ज्ञात नहीं हैं क्योंकि वे रन टाइम पर होते हैं।
  4. आप उन्हें try-catchब्लॉकों के माध्यम से संभालकर अपवादों से उबर सकते हैं ।
  5. Exceptions मुख्य रूप से एप्लिकेशन के कारण ही होता है।
  6. उदाहरण: जांचे हुए अपवादों: SQLException, IOException
    अनियंत्रित अपवाद: ArrayIndexOutOfBoundException, ClassCastException,NullPointerException

आगे पढ़े: http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/ http://javaconceptoftheday.com/wp-content/uploads/2015/04/ErrorVsException.png


7

सूर्य इसे सबसे अच्छा रखता है :

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


3

Errorकक्षा का विवरण काफी स्पष्ट है:

इसका Errorएक उपवर्ग Throwable गंभीर समस्याओं को इंगित करता है जो एक उचित अनुप्रयोग को पकड़ने की कोशिश नहीं करनी चाहिए। अधिकांश ऐसी त्रुटियां असामान्य स्थिति हैं। ThreadDeath हालांकि, "सामान्य" स्थिति की त्रुटि भी एक उपवर्ग है, Errorक्योंकि अधिकांश अनुप्रयोगों को इसे पकड़ने की कोशिश नहीं करनी चाहिए।

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

जावा के वर्गError के स्वयं के प्रलेखन से उद्धृत ।

संक्षेप में, आपको एस को नहीं पकड़ना चाहिए Error, इसके अलावा आपके पास ऐसा करने का एक अच्छा कारण है। (उदाहरण के लिए वेब सर्वर के अपने कार्यान्वयन को रोकने के लिए अगर कोई सर्वलेट मेमोरी से बाहर निकलता है या ऐसा कुछ होता है।)

Exceptionदूसरी ओर, एन किसी अन्य आधुनिक भाषा की तरह ही एक सामान्य अपवाद है। आपको जावा एपीआई प्रलेखन या किसी भी ऑनलाइन या ऑफलाइन संसाधन में विस्तृत विवरण मिलेगा।


2

वर्गों 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विधि हेडर में आवश्यक घोषणा फेंकते समय ।

थ्रोएबल और उसके उत्तराधिकारी वर्ग आरेख (गुण और विधियां छोड़ दी जाती हैं)। यहां छवि विवरण दर्ज करें


1

IMO एक त्रुटि एक ऐसी चीज है जो आपके आवेदन को विफल कर सकती है और इसे नियंत्रित नहीं किया जाना चाहिए। एक अपवाद कुछ ऐसा है जो अप्रत्याशित परिणाम दे सकता है, लेकिन इससे पुनर्प्राप्त किया जा सकता है।

उदाहरण:

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


1

त्रुटियां मुख्य रूप से उस वातावरण के कारण होती हैं जिसमें अनुप्रयोग चल रहा है। उदाहरण के लिए, OutOfMemoryError तब होता है जब JVM मेमोरी से बाहर निकलता है या StackOverflowError तब होता है जब स्टैक ओवरफ्लो होता है।

अपवाद मुख्य रूप से आवेदन के कारण ही होते हैं। उदाहरण के लिए, NullPointerException तब होती है जब कोई एप्लिकेशन अशक्त वस्तु तक पहुंचने का प्रयास करता है या ClassCastException तब होता है जब कोई एप्लिकेशन असंगत वर्ग प्रकारों को डालने का प्रयास करता है।

स्रोत: जावा में त्रुटि बनाम अपवाद के बीच अंतर


"त्रुटियां मुख्य रूप से उस वातावरण के कारण होती हैं जिसमें अनुप्रयोग चल रहा है" और "अपवाद मुख्य रूप से अनुप्रयोग के कारण ही होते हैं" एकदम सही!
एडीजे

0

यहाँ जावा एपीआई से एक बहुत अच्छा सारांश है जो एक त्रुटि और अपवाद का प्रतिनिधित्व करता है:

एक त्रुटि थ्रोबल का एक उपवर्ग है जो गंभीर समस्याओं को इंगित करता है कि एक उचित अनुप्रयोग को पकड़ने की कोशिश नहीं करनी चाहिए। अधिकांश ऐसी त्रुटियां असामान्य स्थिति हैं। थ्रेड-डाउन त्रुटि, हालांकि "सामान्य" स्थिति है, यह भी त्रुटि का एक उपवर्ग है, क्योंकि अधिकांश अनुप्रयोगों को इसे पकड़ने की कोशिश नहीं करनी चाहिए।

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

अपवाद के लिए OTOH, Java API कहता है:

क्लास एक्सेप्शन और उसके उपवर्ग थ्रोबल का एक रूप है जो उन स्थितियों को इंगित करता है जो एक उचित एप्लिकेशन को पकड़ना चाहते हैं।


0

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

उदाहरण: VirtualMachineError- यह इंगित करने के लिए कि जावा वर्चुअल मशीन टूट गई है या ऑपरेटिंग जारी रखने के लिए आवश्यक संसाधनों से बाहर चला गया है। OutOfMemoryErrorतब होता है जब JVM मेमोरी से बाहर निकलता है या StackOverflowErrorतब होता है जब स्टैक ओवर चलता है।

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

उदाहरण: NullPointerExceptionतब होता है जब कोई एप्लिकेशन अशक्त वस्तु तक पहुंचने की कोशिश करता है। या गैर-मौजूदा सूचकांक के साथ एक सरणी तक पहुंचने या गलत डेटा या पैरामीटर के साथ फ़ंक्शन को कॉल करने का प्रयास करना।

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