2009-06-26 12 views
8

मुझे बताया गया था कि जावा में, अनचेक अपवादों को एक कोशिश ब्लॉक में पकड़ा जा सकता है, लेकिन यदि यह पकड़ा गया है, तो इसे चेक अपवाद नहीं कहा जाता है?जावा में एक चेक अपवाद को अवरुद्ध करने के प्रयास में पकड़ा गया एक अनचेक अपवाद नहीं है?

+0

"चेक" की विडंबना .... – Pacerier

उत्तर

13

अनचेक अपवाद अपवाद हैं जिन्हें try - catch ब्लॉक में पकड़े जाने की आवश्यकता नहीं है। अनचेक अपवाद RuntimeException या Error कक्षाओं के उप-वर्ग हैं।

चेक अपवाद अपवाद हैं जिन्हें try - catch ब्लॉक में पकड़ा जाना आवश्यक है।

की जाँच की और अनियंत्रित अपवाद की परिभाषा The Java Language Specification की Section 11.2: Compile-Time Checking of Exceptions में पाया जा सकता है:

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

सिर्फ इसलिए कि एक अनियंत्रित अपवाद एक catch ब्लॉक में फंस जाता है यह एक जाँच अपवाद नहीं है - यह सिर्फ मतलब है कि अनियंत्रित अपवाद पकड़ा गया था, और catch ब्लॉक में संचालित किया गया।

कोई catch एक अनचेक अपवाद, और फिर throw एक नया चेक अपवाद हो सकता है, इसलिए उस विधि को कॉल करने वाली कोई भी विधि जहां एक अनचेक अपवाद हो सकता है और किसी विधि को मजबूर कर सकता है जो इसे किसी प्रकार के अपवाद को संभालने के लिए कहता है।

उदाहरण के लिए, एक NumberFormatException जो जब Integer.parseInt विधि करने के लिए कुछ unparsable String निपटने फेंकी जा सकती है एक अनियंत्रित अपवाद नहीं है, तो यह कैच होने की जरूरत नहीं है। हालांकि, विधि है कि विधि बुला अपने फोन करने वाले ठीक से, ऐसी समस्या को संभालने के लिए तो यह एक और अपवाद जो चेक किया गया है फेंक कर सकते हैं चाहते हो सकता है (RuntimeException का एक उपवर्ग नहीं।):

public int getIntegerFromInput(String s) throws BadInputException { 
    int i = 0; 
    try { 
     i = Integer.parseInt(s); 
    catch (NumberFormatException e) { 
     throw new BadInputException(); 
    } 

    return i; 
} 

उपरोक्त उदाहरण में, एक NumberFormatExceptiontry - catch ब्लॉक में पकड़ा गया है, और एक नया BadInputException (जिसे एक चेक अपवाद माना जाता है) फेंक दिया जाता है।

getIntegerFromInput विधि के लिए कोई भी कॉलर BadInputException को पकड़ने के लिए मजबूर किया जाएगा, और खराब इनपुट से निपटने के लिए मजबूर होना होगा। यदि NumberFormatException को पकड़ा और संभाला नहीं गया था, तो इस विधि के किसी भी कॉलर को अपवाद को सही ढंग से संभालना होगा।

(इसके अलावा, यह ध्यान दिया जाना चाहिए, एक अपवाद खाने और कुछ है कि वास्तव में सार्थक नहीं माना जाता है एक अच्छा अभ्यास नहीं है कर -। अपवाद जहां सार्थक अपवाद संचालन किया जा सकता है संभाल)

जावा ट्यूटोरियल से :

+0

+1 अपवाद खाने और कुछ ऐसा करने के लिए जो वास्तव में सार्थक नहीं है, उसे एक अच्छा अभ्यास नहीं माना जाता है - अपवादों को संभालें जहां सार्थक अपवाद हैंडलिंग किया जा सकता है ' –

1

मुझे लगता है कि अंतर यह है कि संकलक झंडा होगा ध्यान में न आया अपवाद और तरीकों कि अपवाद जाँच फेंक लेकिन उन्हें संकलन समय पर विधि हस्ताक्षर में नहीं घोषित करते जाँच की है।

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

4

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

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