2009-09-03 24 views
32

जावा में कुछ अपवाद क्यों नहीं हैं catch (Exception ex)? यह कोड पूरी तरह से एक अनचाहे अपवाद के साथ विफल रहा है। (जावा संस्करण 1.4)।जावा अपवाद नहीं पकड़ा

public static void main(String[] args) { 
    try { 
     //Code ... 
    } catch (Exception ex) { 
     System.err.println("Caught Exception"); 
     ex.printStackTrace(); 
     exitCode = app.FAILURE_EXIT_CODE; 
    } 
    finally { 
     app.shutdown(); 
    } 
    System.exit(exitCode); 
} 

मैं एक Exception in thread "main" java.lang.NoSuchMethodError

प्राप्त लेकिन यह काम करता है

public static void main(String[] args) { 
    int exitCode = app.SUCCESS_EXIT_CODE; 
    try { 
     //Code ... 
    } catch (java.lang.NoSuchMethodError mex){ 
     System.err.println("Caught NoSuchMethodError"); 
     mex.printStackTrace(); 
     exitCode = app.FAILURE_EXIT_CODE; 
    } catch (Exception ex) { 
     System.err.println("Caught Exception"); 
     ex.printStackTrace(); 
     exitCode = app.FAILURE_EXIT_CODE; 
    } 
    finally { 
     app.shutdown(); 
    } 
    System.exit(exitCode); 
} 

मैं Caught NoSuchMethodError java.lang.NoSuchMethodError:

मिल रहा अपवादों को पकड़ने सभी अपवादों को पकड़ने होगा सोचा है? मैं जावा में सभी अपवाद कैसे पकड़ सकता हूं?

उत्तर

99

क्योंकि कुछ अपवाद Exception से प्राप्त नहीं होते हैं - उदा। Throwable और Error

असल प्रकार पदानुक्रम है:

 Object 
     | 
     Throwable 
    /  \ 
Exception  Error 

केवल Throwables और व्युत्पन्न वर्ग, फेंकी जा सकती है, इसलिए यदि आप Throwable पकड़ने, जो वास्तव में सब कुछ पकड़ लेंगे।

Exception (या Exception ही) अन्यRuntimeException गिनती से प्राप्त के रूप में अपवाद जाँच की उन लोगों की तुलना से पाने कोई अपवाद - वे हैं जिन्हें आप घोषित करने के लिए आप फेंक देंगे, या पकड़ने अगर आप कुछ फोन है कि कर रहे हैं जो उन्हें फेंकता है।

सभी को बताया, जावा अपवाद पदानुक्रम एक मेस का एक सा ...

+6

+1: अच्छा आरेख! – akf

+1

त्रुटियां वास्तव में अपवाद नहीं हैं, इसलिए वे अपवाद से क्यों नहीं निकलते हैं। – Powerlord

+2

@ आर। बेमेरोस - वे जावा भाषा विशिष्टता के अनुसार हैं: "प्रत्येक अपवाद को वर्ग थ्रोबल या इसके उप-वर्गों में से एक उदाहरण के द्वारा दर्शाया जाता है" और "अनचेक अपवाद वर्ग कक्षाएं रनटाइम अपवाद और इसके उप-वर्ग हैं, और कक्षा त्रुटि और इसके उप-वर्ग । " –

3

आप Throwable पकड़ कर सकते हैं है। त्रुटि और अपवाद Throwable का विस्तार करें।

फेंकने योग्य JavaDoc देखें:

फेंकने योग्य वर्ग सभी त्रुटियों और जावा भाषा में अपवाद की सुपर क्लास है।

4

अपवाद केवल एक प्रकार का थ्रोबल है; NoSuchMethodError एक अपवाद नहीं है, लेकिन एक त्रुटि, जो एक और प्रकार का थ्रोबल है।

0

जैसा कि दोनों अन्य पद बताते हैं, पकड़ें (अपवाद ई) केवल Exception से प्राप्त अपवादों के लिए काम करेगा। हालांकि, यदि आप पेड़ पदानुक्रम को देखते हैं, तो आप देखेंगे कि Throwable पर एक अपवाद। थ्रोएबल भी Error के लिए बेस क्लास भी है। तो, NoSuchMethodError के मामले में, यह एक त्रुटि है और अपवाद नहीं है। नामकरण सम्मेलन पर ध्यान दें * त्रुटि बनाम * अपवाद (उदाहरण के लिए, IOException में)।

1

जैसा कि अन्य पोस्टर ने इंगित किया है, सभी फेंकने योग्य वस्तुएं Exception के उप-वर्ग नहीं हैं। हालांकि, ज्यादातर परिस्थितियों में, Error या Throwable को पकड़ना अच्छा नहीं है, क्योंकि इन स्थितियों में कुछ गंभीर त्रुटि स्थितियां शामिल हैं जिन्हें आसानी से पुनर्प्राप्त नहीं किया जा सकता है। आपका रिकवरी कोड सिर्फ चीजों को और खराब कर सकता है।

+0

अंत में अभी भी एक त्रुटि के आसपास निष्पादित होगा? –

+0

हां। लेकिन आपको और समस्याएं हो सकती हैं। जैसे क्या होता है जब आप आउटऑफमेमरी एरर पकड़ते हैं? –

5

Error एस Exception एस नहीं हैं।

वर्ग अपवाद और उसके उपवर्गों फेंकने योग्य का एक रूप है कि की स्थिति है कि एक उचित आवेदन को पकड़ने के लिए चाहते हो सकता है का संकेत देता है।

- JavaDoc for java.lang.Exception

कोई त्रुटि फेंकने योग्य का एक उपवर्ग है कि गंभीर समस्याओं है कि एक उचित आवेदन को पकड़ने की कोशिश नहीं करनी चाहिए इंगित करता है।

- JavaDoc for java.lang.Error

कुछ त्रुटियों, इस तरह के ThreadDeath के रूप में है कि आप को पकड़ने के लिए चाहते हो सकता है कर रहे हैं। ThreadDeath, एक त्रुटि के रूप में वर्गीकृत किया जाता है के रूप में नीचे

समझाया वर्ग ThreadDeath विशेष रूप से बल्कि अपवाद से त्रुटि का एक उपवर्ग है, भले ही यह एक "सामान्य घटना" है, क्योंकि कई आवेदन पकड़ की सभी घटनाओं अपवाद और फिर अपवाद को त्यागें।

- JavaDoc for ThreadDeath

हालांकि, बाद से थ्रेड के बंद() विधि अब पदावनत है, आप इसे उपयोग नहीं करना चाहिए, और इस तरह आप ThreadDeath कभी नहीं देखना चाहिए।

+0

जावा भाषा विनिर्देश आपके साथ असहमत है: "अनचेक अपवाद वर्ग कक्षा RuntimeException और इसके उप-वर्ग हैं, और वर्ग त्रुटि और इसके उप-वर्ग हैं।" –

+0

मैं विशेष रूप से त्रुटियों को पकड़ने पर सलाह की सराहना करता हूं। 'OutOfMemoryErrors' पर विचार करें - इसे फेंकने के बाद एक खराब स्थिति में एक एप्लिकेशन छोड़ा जा सकता है। इस तरह की 'त्रुटि' को पकड़ना और त्यागना बुद्धिमान नहीं होगा। – akf

+0

असल में, जेएलएस हमेशा अपवादों के रूप में "चीजें जिन्हें फेंक और पकड़ा जा सकता है" को संदर्भित करता है। आपने उद्धृत कुछ भी नहीं कहा है कि एक त्रुटि अपवाद नहीं है। –

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