2010-12-02 5 views
5

यदि किसी ऐसे विधि के लिए बाइट कोड लिखना संभव है जो चेक अपवाद को फेंकने वाला है?स्कैला जेनरेट कोड बाइट कोड कैसे अपवाद को छोड़ देता है?

उदाहरण के लिए निम्नलिखित जावा वर्ग संकलन नहीं है जब तक कि विधि वाणी यह ​​जाँच अपवाद फेंकता है:

public class CheckedExceptionJava { 
    public Class<?> testChecked(String s) throws ClassNotFoundException { 
    return Class.forName(s); 
    } 
} 

जबकि निम्नलिखित स्काला बराबर करता है (क्योंकि स्काला अपवाद जाँच की है नहीं करता है):

class CheckedException { 
    def testChecked(s : String) = Class.forName(s) 
} 

यहां तक ​​कि अगर उत्पन्न बाईटकोड लगभग समान हैं:

Compiled from "CheckedExceptionJava.java" 
public class CheckedExceptionJava extends java.lang.Object{ 
public CheckedExceptionJava(); 
    Code: 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: return 

public java.lang.Class testChecked(java.lang.String) throws java.lang.ClassNotFoundException; 
    Code: 
    0: aload_1 
    1: invokestatic #2; //Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class; 
    4: areturn 

} 

Compiled from "CheckedException.scala" 
public class CheckedException extends java.lang.Object implements scala.ScalaObject{ 
public CheckedException(); 
    Code: 
    0: aload_0 
    1: invokespecial #24; //Method java/lang/Object."<init>":()V 
    4: return 

public java.lang.Class testChecked(java.lang.String); 
    Code: 
    0: aload_1 
    1: invokestatic #11; //Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class; 
    4: areturn 

} 

प्रश्न: क्या यह संभव है (और कैसे) बाइटकोड उत्पन्न करने के लिए यह चिह्नित नहीं करता है कि यह एक चेक अपवाद फेंकता है भले ही उस विधि के अंदर कोड इसे संभाल नहीं लेता है?

उत्तर

13

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

+0

ओह, मैं देखता हूं। शायद जवासिस्ट जैसे उपकरण के साथ? :) http://bit.ly/gNzXfA – OscarRyz

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