2012-10-31 31 views
8

मेरी समझ से, throw एक प्राइमेटिव जेवीएम कमांड है। जब इसे कहा जाता है, तो JVM "जांचता है कि वर्तमान कॉल स्टैक इसे पकड़ सकता है"। यदि यह नहीं हो सकता है, तो जावा बस कॉल स्टैक को लगभग ठीक उसी तरह पॉप करता है जैसे कि एक रिटर्न कहा जाता था। तो जेवीएम "जांचता है कि वर्तमान कॉल स्टैक इसे पकड़ सकता है" और फिर रिकर्सिव पर।जेवीएम कैसे पता चलता है कि रनटाइम पर अपवाद कैसा है?

मेरा प्रश्न: जेवीएम के लिए यह एल्गोरिदमिक रूप से संभव है कि कॉल स्टैक में कहां दिया गया अपवाद पकड़ सकता है? क्या कोड ब्लॉक में प्रत्येक कॉल स्टैक एंट्री मैपिंग अपवादों में मेटाडेटा संग्रहीत है? क्या ढेर में एक स्थिर डेटा संरचना है जो किसी भी तरह इसका ट्रैक रखती है? क्योंकि कहीं भी डेटा को ट्रैक रखने के लिए डेटा होना चाहिए।

+1

संबंधित: http://stackoverflow.com/questions/10301244/how-is-multi-catch-implemented-in-java-7 – assylias

उत्तर

9

JVM specification इस बारे में विवरण है।

विशेष रूप से, section 4.7.3 अपवाद तालिका के बारे में विवरण देता है, जो प्रविष्टियों की एक श्रृंखला है जिसमें कहा गया है कि कौन से अपवादों को निर्देशों के बीच पकड़ा जाता है। Section 3.12 इसका एक ठोस उदाहरण देता है।

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

+0

बहुत रोचक :) – Mik378

1

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

फिर, स्टैक में प्रत्येक विधि के लिए (विधि के साथ शुरूआत जहां अपवाद हुआ और पीछे की ओर काम कर रहा है), जेवीएम विधि के तालिका मैपिंग पर (आंतरिक वर्ग ऑब्जेक्ट में) दिखता है/बाइट कोड/मशीन निर्देशों को पकड़ने की कोशिश करता है बीच है।

यदि किसी विधि के लिए तालिका में "मैच" पाया जाता है, और अपवाद को अपनाने के प्रकार की श्रेणी में निगरानी के लिए एक वर्ग की निगरानी की जा रही है, तो अपवाद सेट करने के बाद नियंत्रण catch प्रविष्टि बिंदु पर स्थानांतरित कर दिया जाता है पैरामीटर स्थान के प्रकार में catch खंड इसका संदर्भ दे सकता है।

यदि तालिका में "मैच" नहीं मिलता है तो कॉल स्टैक प्रभावी रूप से "पॉप किया गया" होता है, अगली विधि को स्टैक के शीर्ष पर रखता है, और उपरोक्त विधि की तालिका में "मैच" के लिए उपरोक्त खोज कोशिश/पकड़ श्रृंखला का दोहराया जाता है।

यह निश्चित रूप से एक अति-सरलीकरण है। finally श्रेणियों, उदाहरण के लिए, और कई "एज" मामलों को संभालने में बहुत सारे अतिरिक्त तर्क शामिल हैं।