मैं जावा बाइटकोड में कुछ त्रुटि प्रबंधन करने की कोशिश कर रहा हूं। मैं पहली बार कुछ पकड़ने की तरह सबरूटीन्स, जहाँ मैं त्रुटि स्थिति के लिए जाँच करेगा लागू, और उचित सबरूटीन, एक छोटे से की तरह करने के लिए कूदने की कोशिश की:जावा बाइटकोड में कोशिश/पकड़ अपवादों से निपटना? ("स्टैक ऊंचाई असंगत")
iconst_1
iconst_0
dup
ifeq calldiverr
goto enddivtest
calldiverr:
jsr divError
enddivtest:
idiv
...More instructions...
divError:
getstatic java/lang/System/out Ljava/io/PrintStream;
ldc "Oh dear you divided by 0!"
invokevirtual java/io/PrintStream/print(Ljava/lang/String;)V
ऊपर के साथ समस्या यह है कि मैं कई निर्देश है जब जो इस सबराउटिन पर कूदता है, बाइटकोड चलाते समय मुझे एक त्रुटि संदेश मिलता है, कहता है कि ढेर की ऊंचाई असंगत है।
शायद अपवादों का उपयोग करना इस के आसपास जाने का सबसे अच्छा तरीका है?
कुछ Googling से मैं ने पाया है कि आप अपवाद वर्गों के उदाहरण बना सकते हैं और की तरह कुछ के साथ आरंभ कर सकते हैं:
new java/lang/Exception
dup
ldc "exception message!"
invokespecial java/lang/Exception/<init>(Ljava/lang/String;)V
मैंने यह भी पाया है कि आप उन्हें athrow
साथ फेंक कर सकते हैं और यह ठीक लगता है।
मुझे भ्रमित करने वाला क्या है, हालांकि वास्तव में अपवाद कैसे पकड़े जाते हैं। ऐसा लगता है कि एक जादुई "अपवाद तालिका" है जो एक साथ अपवादों को फेंकने और पकड़ने का संकेत देती है, लेकिन मुझे नहीं पता कि इनमें से एक को कैसे स्क्रैच से बाइटकोड लिखना है (और जैस्मीन का उपयोग करके संयोजन करना)। क्या कोई मुझे अपवाद तालिका बनाने का रहस्य बता सकता है? और संभवतः मुझे अपवाद हैंडलिंग का एक उदाहरण दें जो जैस्मीन के साथ इकट्ठा होगा?
वास्तव में, यह एक 'jsr' है जो कभी नहीं' ret's के लिए पूरी तरह से कानूनी है। Subroutines पर प्रतिबंध 1) प्रत्येक subroutine केवल एक ही ret हो सकता है (तो आप उदाहरण के लिए उन्हें शामिल किए बिना अगर दोनों की शाखाओं पर ret ret नहीं कर सकते हैं)। 2) subroutine कॉल एक पेड़ बनाना चाहिए। इसके अलावा, टाइपिंग द्वारा लगाए गए लोगों के बगल में कोई प्रतिबंध नहीं है। – Antimony
वास्तव में जटिल हिस्सा सबराउटिन के शरीर के रूप में माना जाता है की सटीक परिभाषा है, क्योंकि यह प्रकार की जांच एल्गोरिदम के विवरण पर निर्भर करता है। सौभाग्य से, हॉटस्पॉट ओपन सोर्स है और यदि आप रुचि रखते हैं तो आप इसे स्वयं निर्धारित कर सकते हैं। यहां प्रासंगिक फ़ाइल http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/tip/src/share/native/common/check_code.c है। जाहिर है, यह कार्यान्वयन निर्भर है, इसलिए यदि आप गैर-हॉटस्पॉट वीएमएस के बारे में परवाह करते हैं, तो आपको यह सुनिश्चित करना चाहिए कि इस तरह की अस्पष्टताओं से बचने के लिए आपके सबराउटिन अच्छी तरह से संरचित हैं। – Antimony
@ एंटीमोनी - जैसा कि मैंने कहा, जेएसआर के नियमों की मेरी याददाश्त अस्पष्ट है - अब 5-6 साल के लिए सत्यापनकर्ता के साथ नहीं मिला है। आईआईआरसी, हालांकि, सबराउटिन के अंदर के नियमों के लिए नियम काफी सीधे हैं - सबराउटिन में होने के लिए एक बिंदु प्रविष्टि बिंदु से पहुंच योग्य होना चाहिए, और एक बिंदु प्रश्न से बिंदु तक पहुंच योग्य होना चाहिए। उस पर कोई अस्पष्टता नहीं होनी चाहिए। –