2012-04-24 12 views
11

जावा 7 कंपाइलर बहु-पकड़ ब्लॉक को कैसे संभालने वाला है? एक निष्क्रिय कार्यान्वयन बाइटकोड उत्पन्न करना होगा जैसे कि एकाधिक पकड़ ब्लॉक मौजूद हैं। हालांकि, मैंने कई स्रोतों से एकत्र किया है कि यह मामला नहीं है - कई अपवाद प्रकारों को संभालने वाला एक कैच ब्लॉक संकलन के दौरान कोई डुप्लिकेट बाइटकोड नहीं देता है।जावा 7 में मल्टी-कैच लागू किया गया है?

तो, यह कैसे काम करता है? क्या कोई नया बाइटकोड निर्देश है जो बहु-पकड़ ब्लॉक के बारे में JVM को बताता है?

+0

की डुप्लीकेट [जावा 7 कोशिश के साथ-संसाधनों बाईटकोड बराबर क्या उपयोग कर रहा है कोशिश-पकड़ने-अंत में?] (http://stackoverflow.com/questions/7860137/what-is-the-java-7-try-with-resources-bytecode-equivalent-using-try-catch-finall)। –

उत्तर

15

Java Virtual Machine Specification के आधार पर, अपवाद संकलित किए जाते हैं (सारांश में) इस प्रकार है:

  • कोशिश कोड सामान्य रूप से चलाया जाता है
  • प्रत्येक कैच ब्लॉक सही कैच ब्लॉक करने के लिए निष्पादन प्रवाह रीडायरेक्ट करने के लिए एक अपवाद तालिका है जैसे कि यह एक अलग विधि
  • थे संकलित किया गया है
  • +०१२३५१६४१०

एक बहु पकड़ खंड का उपयोग करते समय, कैच ब्लॉक समान होता है (केवल एक बार प्रकट होता है), लेकिन अपवाद तालिका में मूल्यों के साथ, और लक्ष्य मूल्यों के साथ एक और प्रविष्टि होगी।

उदाहरण के लिए, इस कोड:

public static void main(String args[]) throws InterruptedException { 
    try { 
     System.out.println("why not?"); 
    } catch (IllegalArgumentException e) { 
     System.out.println("here"); 
    } catch (IllegalStateException | ArithmeticException e) { 
     System.out.println("there"); 
    } 
} 

निम्नलिखित अपवाद तालिका (मेरी मशीन पर) उत्पन्न करता है:

from to target type 
     0  8 11 Class java/lang/IllegalArgumentException 
     0  8 23 Class java/lang/IllegalStateException 
     0  8 23 Class java/lang/ArithmeticException 
1

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

http://www.artima.com/underthehood/exceptions.html

इस के अनुसार, तुम सिर्फ अपवाद तालिका में एक नई प्रविष्टि बनाने के लिए है और मैं नहीं दिख रहा है यही कारण है कि दो प्रविष्टियों सिर्फ एक ही पीसी ऑफसेट को इंगित नहीं कर सका।

(अस्वीकरण: मैं बाईटकोड में कोई विशेषज्ञ हूँ, साल में एक को छुआ नहीं किया है और इसलिए कुछ याद कर सकते हैं)