2010-03-10 12 views
9

अपवाद के बारे में पढ़ते समय, मैं हमेशा चेक अपवादों और अनचेक अपवादों पर आउंगा, इसलिए जानना चाहता था कि यह कैसे अंतर है?जावा में चेक किए गए और अनचेक अपवादों की पहचान कैसे करें?

संपादित करें: मैं जानना चाहता हूं कि क्या मैं कोई अपवाद वर्ग बना सकता हूं तो मैं चेक के रूप में या अनचेक के रूप में कैसे बना सकता हूं?

और प्रत्येक का महत्व क्या है?

उत्तर

14

java.lang.RuntimeException या java.lang.Error के उप-वर्गों को छोड़कर सभी Throwable एस चेक किए गए हैं। उचित रूप से, जावा में, "अपवाद" java.lang.Exception के उप-वर्ग हैं, "त्रुटियां" java.lang.Error और java.lang.Throwable के उप-वर्ग हैं, आमतौर पर सीधे उप-वर्गीकृत नहीं होते हैं।

कार्यक्रम एक RuntimeException का उपयोग कर यदि आप इसे की जाँच की जा नहीं करना चाहती अपने स्वयं के Error उपवर्गों बनाने के लिए (हालांकि प्रलेखन बल्कि उस पर अस्पष्ट है) तो आम तौर पर आप हमेशा Exceptions बनाने नहीं जा सकते,।

रन-टाइम में पता करने के लिए यदि आप एक जाँच की अपवाद है आप इस्तेमाल कर सकते हैं:

if(throwable instanceof Exception && !(throwable instanceof RuntimeException)) { 
    // this is a checked Exception 
    } 

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

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

संपादित 2012-10-23: टिप्पणियों के जवाब में (जो काफी मान्य हैं), स्पष्ट करने के लिए, निम्नलिखित होगा क्या हुआ अगर एक पर कब्जा कर लिया Throwable एक जाँच की Throwable विपरीत है निर्धारित करने के लिए आवश्यक है एक जाँच की Exception रहे हैं:

if(obj instanceof Throwable && !(obj instanceof RuntimeException) && !(obj instanceof Error)) { 
    // this is a checked Throwable - i.e. Throwable, but not RuntimeException or Error 
    } 

प्रश्न में वस्तु जाना जाता हैThrowable का उदाहरण होने के लिए (उदा। इसे पकड़ा गया था), उपरोक्त 'if' की केवल दूसरी भाग की आवश्यकता है (उदाहरण के लिए थ्रोबल के लिए परीक्षण अनावश्यक है)।

+1

यह उन अपवादों को याद करता है जो 'थ्रोबल' से प्राप्त होते हैं लेकिन 'अपवाद' से नहीं, जिन्हें चेक किया जाता है। आम तौर पर आपके पास: एक अनचेक 'अपवाद' टी संतुष्ट होगा: 't exampleof त्रुटि || टी उदाहरण का अपवाद ' अन्य सभी जो' थ्रोवेबल 'का उदाहरण है चेक किया गया है। एक त्रुटि सामान्य अर्थ में अपवाद का एक प्रकार है। – BeeOnRope

+0

@ बीई: एक अर्थ में यह काफी सही है; लेकिन, 'त्रुटि *** *** त्रुटियां *** नहीं हैं *** अपवाद ***, और जावा नामकरण में भेद बनाता है (' त्रुटि 'हैंडलिंग एक और मामला है जहां सिद्धांत अभ्यास में विफल रहता है, लेकिन, मैंने सोचा, एक संबंधित अभी तक अलग चर्चा)। यही है, 'त्रुटि की भी जांच की जाती है, लेकिन जावा नामकरण में वे त्रुटियां हैं, अपवाद नहीं; हालांकि दोनों त्रुटियों और अपवाद 'थ्रोबल' हैं। जावा के अनुसार, एक 'त्रुटि' एक 'थ्रोबल' है लेकिन 'अपवाद' नहीं है (आमतौर पर अंग्रेजी में, 'त्रुटि' अपवाद हैं, लेकिन वे "अपवाद" नहीं हैं)। –

+1

बिल्कुल। उस ने कहा, मैं एक विधि मानूंगा जो तय करता है कि एक फेंकने योग्य चेक किया गया था या नहीं, सभी चेक अपवादों के लिए सच नहीं होगा, न केवल अपवादों की जांच की।यही है, यह शब्द की छोटी और समझ लेगा। मैं उन चीज़ों को छोड़कर वैध उपयोग केस नहीं देख सकता जो 'थ्रोबल' बढ़ाते हैं लेकिन 'अपवाद' या 'त्रुटि' नहीं। वैसे भी आप उन्हें क्या कहते हैं? – BeeOnRope

1

यदि अपवाद वर्ग RuntimeException का उप-वर्ग है, तो यह चेक नहीं किया गया है और कार्यों या पकड़े गए आदि के लिए घोषित नहीं किया जाना चाहिए। Error अपवादों को भी घोषित/पकड़ा नहीं जाना चाहिए। क्या आप यही पूछ रहे हैं?

0

काफी यकीन है कि इससे पहले पूछा जाएगा और उत्तर दिया जाएगा, लेकिन इसके लिए, यह यहां काफी अच्छी तरह से कवर किया गया है: http://www.javapractices.com/topic/TopicAction.do?Id=129

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

उनके नाम इंगित करता है, कॉल करने, निपटने के लिए साथ अपवाद जाँच बाध्य कर रहे हैं आम तौर पर उन्हें (try/catch) को पकड़ कर या उन्हें आगे गुजर ढेर अप। अनचेक अपवाद आमतौर पर कॉलर के नियंत्रण के बाहर तत्वों के कारण होने के लिए समझा जाता है।

+1

त्रुटियाँ भी अनियंत्रित हैं संकलक प्रोग्रामर इन संभाल करने के लिए बाध्य करेगा नहीं, आप केवल आप IE उनके लिए देखभाल करने के लिए है, हालांकि मुझे लगता है कि आप बहस कर सकते हैं कि वे अपवाद नहीं ... –

4

Java Language Spec, chapter 11 देखें:

अनियंत्रित अपवाद कक्षाएं वर्ग RuntimeException और उसके उपवर्गों, और कक्षा Error और उसके उपवर्गों हैं। अन्य सभी अपवाद वर्गों को अपवाद वर्गों की जांच की जाती है। जावा एपीआई कई अपवाद वर्गों को परिभाषित करता है, दोनों चेक और अनचेक किए गए हैं। अतिरिक्त अपवाद वर्ग, चेक और अनचेक दोनों, प्रोग्रामर द्वारा घोषित किया जा सकता है।

आप रनटाइम पर instanceof के माध्यम से इस की जांच कर सकता है, हालांकि मैं वास्तव में नहीं दिख रहा है, जहां इस उपयोगी होगा।

अपने प्रश्न के दूसरे भाग के लिए के रूप में:

  • जाँच अपवाद की उम्मीद का प्रतिनिधित्व करते हैं त्रुटि की स्थिति है, जो सामान्य प्रोग्राम निष्पादन के दौरान हो सकता है और इसलिए हमेशा प्रोग्राम के नियंत्रित किया जा करने के लिए है (संकलक लागू करता है जो)

  • अनचेक अपवाद अप्रत्याशित त्रुटि स्थितियों का प्रतिनिधित्व करता है और अमान्य इनपुट, बग या रनटाइम प्रतिबंध (जैसे स्मृति) के कारण आपके प्रोग्राम की असामान्य स्थिति को इंगित करता है; अगर आप उनकी घटना के बारे में पता

+0

@ क्रिस्टोफ पर असफल रहा: और निश्चित रूप से प्रोग्रामिंग का एक पूरा विद्यालय है जो मानता है कि "एक अपेक्षित त्रुटि स्थिति" वास्तव में एक त्रुटि नहीं है और यह देखा गया है कि बहुत सी भाषाएं * अवधारणा के बिना पूरी तरह से ठीक होती हैं * चेक अपवाद का उनका अस्तित्व बहस योग्य है। जोशुआ ब्लोच, प्रभावी जावा, * "अपवाद पर राज्य परीक्षण विधि पसंद करें" *। और फिर निश्चित रूप से प्रोग्रामिंग का स्कूल है जो GOTO से नफरत करता है और फ्लोथेटी-जैसी गोटो प्रोग्रामिंग होने के लिए प्रवाह नियंत्रण के लिए चेक अपवादों का उपयोग करने पर विचार किया जाता है। मैं एक शिविर या दूसरे के साथ साइडिंग नहीं कर रहा हूं, सिर्फ वर्तमान स्थिति की स्थिति बता रहा हूं :) – SyntaxT3rr0r

-2
package practice; 

import java.io.IOException; 

class Practice 
{ 
    public static void main(String args[]) 
    { 
     Exception n=new NullPointerException(); 
     if(n instanceof RuntimeException) 
     { 
      System.out.println("this is a runtime(unchecked) exception"); 
     } 
     else 
     { 
      System.out.println("this is not a compiletime(checked) exception"); 
     } 

    } 

} 
+0

क्या आप बता सकते हैं _why_ यह आपके उत्तर को बेहतर बनाने के लिए काम कर सकता है? – Ben

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