2012-08-01 24 views
10

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

सी ++

void function(JNIEnv * env, jclass jc) { 
    jclass newExcCls = env->FindClass("java/lang/NullPointerException"); 
    env->ThrowNew(newExcCls, "ERROR"); 
} 

जावा

public class Tester { 
    static { 
     System.loadLibrary("MyLibrary"); 
    }   
    private static native void function(); 
    public static void main(String [ ] args) { 
     try { 
      function(); 
     } catch(Exception e) { //is it caught? Or what happens? 
      e.printStackTrace(); 
     }   
    } 
} 

(सी ++ फ़ंक्शन का नाम शायद घायल कर दिया जाएगा। इसके अलावा LoadLibrary एक कोशिश पकड़ में होना चाहिए। परवाह मत करो, मैं यह विश्वास नहीं करते समस्या से प्रासंगिक। कोड में संभवतः अन्य त्रुटियां हैं, लेकिन संभवतः वे प्रासंगिक नहीं हैं।)

+0

मुझे आश्चर्य है कि यह एक डुप्लिकेट नहीं है। –

उत्तर

5

आपको चेक अपवाद तंत्र को मूर्ख बनाने के लिए मूल कोड का भी सहारा लेना नहीं है मीटर। Javadoc on Thread.stop(Throwable) देखें। मैं एक बार पूरे दिन सोच रहा था कि कैसे कोड ने कोड के बीच में InterruptedException फेंक दिया जिसने इसे घोषित नहीं किया था। मुझे तब भी जवाब नहीं मिला, लेकिन अब मुझे पता है :)

अपने तत्काल प्रश्न का उत्तर दें: हाँ, चेक अपवाद तर्क एक कंपाइलर-केवल सुविधा है और रनटाइम पर अनदेखा किया जाता है।

+0

आपके द्वारा लिंक किया गया फ़ंक्शन एक अच्छा उदाहरण नहीं है, क्योंकि यह केवल अनचेक अपवादों को फेंकता है जहां तक ​​मैं देख सकता हूं, जो फेंक विनिर्देश सूची में नहीं होना चाहिए। –

+0

निम्नलिखित वाक्य पढ़ें, फिर: "इस थ्रेड द्वारा प्रस्तुत धागा को असामान्य रूप से जो कुछ भी कर रहा है उसे पूरा करने के लिए मजबूर होना और थ्रोबल ऑब्जेक्ट obj को अपवाद के रूप में फेंकना है।" –

+0

ओह, उस वाक्य को याद किया, मैं अपवाद वर्ग के नाम की तलाश में था। दिलचस्प खोज –

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