मुख्य विधि द्वारा फेंके गए अपवाद को जेवीएम कैसे संभालता है?


10

मैं अपवादों को समझता हूं, उन्हें फेंक रहा हूं, उन्हें संभाल रहा हूं, और कॉल स्टैक (यानी throws) में एक विधि कम करने के लिए उन्हें प्रचारित कर रहा हूं ।

मुझे यह समझ में नहीं आता है:

public static void main(String[] args) throws Exception {
    ...
}

अब, मुझे लगता है कि मामले में जो mainएक फेंकता है Exception, जेवीएम इसे संभालता है (सही?)। अगर ऐसा है, तो मेरा सवाल यह है:

जेवीएम कैसे अपवाद रखता है main? यह क्या करता है?

जवाबों:


19

आप सोच सकते हैं कि public static void mainजावा में विधि या mainसी में फ़ंक्शन आपके प्रोग्राम का वास्तविक प्रवेश बिंदु है - लेकिन यह नहीं है। सभी उच्च-स्तरीय भाषाओं (C सहित) में एक भाषा रनटाइम होता है जो प्रोग्राम को इनिशियलाइज़ करता है, और फिर एंट्री पॉइंट पर कंट्रोल फ़्लो को स्थानांतरित करता है। जावा के मामले में, आरंभ में शामिल होंगे:

  • जेवीएम की स्थापना
  • आवश्यक कक्षाएं लोड हो रही हैं
  • स्थैतिक आरम्भिक ब्लॉक चलाना। यह mainलागू होने से पहले उपयोगकर्ता-परिभाषित कोड निष्पादित कर सकता है। इन ब्लॉकों को अपवाद नहीं माना जाता है।

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

चित्रण के प्रयोजनों के लिए, आप एक विशाल ट्राइ-कैच में सभी कोड को लपेटकर रनटाइम की इमेजिंग कर सकते हैं जो दिखता है

try {
    loadClasses();
    runInitializers();
    main(argv);
    System.exit(0);
} catch (Throwable e) {
    e.printStackTrace();
    System.exit(-1);
}

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


9

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

  • जेवीएम खुद को ऊपर उठाता है और निष्पादन वातावरण तैयार करता है।
  • JVM एक थ्रेड बनाता है main()जो कि कमांड-लाइन मापदंडों के लागू होने पर विधि का उपयोग करेगा ।
  • JVM एक डिफ़ॉल्ट अनकैप्ड अपवाद हैंडलर सेट करता है जो मानक त्रुटि के अपवाद को प्रिंट करता है और समाप्त करता है।
  • JVM थ्रेड निष्पादित करता है।

अनियोजित अपवाद के मामले में, कार्यक्रम प्रभावी रूप से ऊपर तीसरे आइटम के अनुसार मर जाता है। यह व्यवहार जावा भाषा विनिर्देश, धारा 11.3 में निर्दिष्ट है


अतिरिक्त जानकारी

दूसरों ने स्थिर ब्लॉकों का उल्लेख किया है और वे पहले कैसे निष्पादित करते हैं main()। हालांकि, इसे सही ढंग से समझने के लिए थोड़ा और स्पष्टीकरण की आवश्यकता है।

क्लास को लोड करते समय, क्लास लोडर को सभी static finalस्टेट को इनिशियलाइज़ करना होगा और क्लास को इस्तेमाल करने से पहले सभी staticब्लॉक को चलाना होगा , क्लास के इंस्टेंटिमिटिंग इंस्टेंस को शामिल करने के लिए (एक तरफ: एक जावा क्लास बनाएँ जहाँ एक क्लास स्थैतिक को एक स्टैटिक ब्लॉक बनाने के बाद शुरू किया जाता है। वर्ग का उदाहरण, और कंस्ट्रक्टर स्थिर का संदर्भ देता है। बूम!)। हालाँकि, यह सभी किसी भी कोड को संदर्भित करने से पहले कक्षा लोडर तर्क में होता है । इसके अलावा, कक्षा को संदर्भित करने वाले थ्रेड में जो भी लोड किया जाता है।

इसका मतलब यह है कि यदि वर्ग main()किसी अन्य वर्ग (जैसे वर्ग स्थिर) का संदर्भ देता है, तो उस वर्ग कोmain() अपने स्थिर ब्लॉकों को शामिल करने के लिए निष्पादित करने से पहले लोड किया जाना चाहिए । अन्यथा, स्थिर ब्लॉकों को ऊपर के रूप में निष्पादित किया जाता है। यदि वर्ग लोड करने में विफल रहता है, तो वर्ग युक्त main()भी लोड करने में विफल हो जाएगा और कार्यक्रम समाप्त हो जाएगा।

एक और FYI: स्टेटिक ब्लॉक फेंक सकते हैंErrorsके रूप में फेंक दिया जाता है। Exceptionsनिषिद्ध हैं (संकलन-समय त्रुटि)। ExceptionInInitializerErrorRuntimeExceptions में लिपटे हुए हैं । ये ध्यान में न आया अपवाद संचालक, जब तक आप ध्यान से वर्ग संदर्भ (और लोड हो रहा है) एक में लपेट जो आम तौर पर या तो धागा या आवेदन (मुख्य थ्रेड) मार डालेगा प्रति नियंत्रित किया जाता है - ।trycatch

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