2011-08-09 23 views
12
public class Strange1 { 
    public static void main(String[] args) { 
    try { 
     Missing m = new Missing(); 
    } catch (java.lang.NoClassDefFoundError ex) { 
     System.out.println("Got it!"); 
    } 
    } 
} 

public class Strange2 { 
    public static void main(String[] args) { 
    Missing m; 
    try { 
     m = new Missing(); 
    } catch (java.lang.NoClassDefFoundError ex) { 
     System.out.println("Got it!"); 
    } 
    } 
} 

class Missing { 
    Missing() { } 
} 

आप Missing.class को हटाने के बाद Strange1 और Strange2 चलाते हैं, Strange1 NoClassDefFoundError; फेंक देते हैं लेकिन Strange2 समझ गए प्रिंट होगा!ट्रिकी कोशिश पकड़ जावा कोड

किसी को भी है कि व्याख्या कर सकते हैं? धन्यवाद।

अद्यतन:

Strange1 के लिए जावा बाईटकोड:

 0 new info.liuxuan.test.Missing [16] 
    3 dup 
    4 invokespecial info.liuxuan.test.Missing() [18] 
    7 astore_1 [m] 
    8 goto 20 
    11 astore_1 [ex] 
    12 getstatic java.lang.System.out : java.io.PrintStream [19] 
    15 ldc <String "Got it!"> [25] 
    17 invokevirtual java.io.PrintStream.println(java.lang.String) : void [27] 
    20 return 
     Exception Table: 
     [pc: 0, pc: 8] -> 11 when : java.lang.NoClassDefFoundError 
     Line numbers: 
     [pc: 0, line: 14] 
     [pc: 11, line: 15] 
     [pc: 12, line: 16] 
     [pc: 20, line: 18] 
     Local variable table: 
     [pc: 0, pc: 21] local: args index: 0 type: java.lang.String[] 
     [pc: 8, pc: 11] local: m index: 1 type: info.liuxuan.test.Missing 
     [pc: 12, pc: 20] local: ex index: 1 type: java.lang.NoClassDefFoundError 

Strange2 के लिए जावा बाईटकोड:

11 astore_1 [ex] 
:

 0 new info.liuxuan.test.Missing [16] 
    3 dup 
    4 invokespecial info.liuxuan.test.Missing() [18] 
    7 astore_1 [m] 
    8 goto 20 
    11 astore_2 [ex] 
    12 getstatic java.lang.System.out : java.io.PrintStream [19] 
    15 ldc <String "Got it!"> [25] 
    17 invokevirtual java.io.PrintStream.println(java.lang.String) : void [27] 
    20 return 
     Exception Table: 
     [pc: 0, pc: 8] -> 11 when : java.lang.NoClassDefFoundError 
     Line numbers: 
     [pc: 0, line: 15] 
     [pc: 11, line: 16] 
     [pc: 12, line: 17] 
     [pc: 20, line: 19] 
     Local variable table: 
     [pc: 0, pc: 21] local: args index: 0 type: java.lang.String[] 
     [pc: 8, pc: 11] local: m index: 1 type: info.liuxuan.test.Missing 
     [pc: 12, pc: 20] local: ex index: 2 type: java.lang.NoClassDefFoundError 

केवल एक जगह अलग है नहीं है

और

11 astore_2 [ex] 

फिर से अद्यतन:

हर कोई ग्रहण में यह कोशिश कर सकते हैं।

+0

अंतर देखने के लिए उत्पन्न बाइटकोड देखें। – Thilo

+1

वे दोनों प्रिंट "इसे मिला!" मेरे लिए। –

+0

"हटाएं" से आपका क्या मतलब है? अगर यह संकलन समय पर मौजूद नहीं है तो इसे संकलित भी नहीं करना चाहिए। अधिक विशिष्ट होने के लिए कृपया अपना प्रश्न संपादित करें। इसके अलावा, शीर्षक का सवाल इस सवाल के संबंध में कुछ भी नहीं है - क्या आप इसे और अधिक विशिष्ट बनाने के लिए भी संपादित कर सकते हैं? –

उत्तर

2

कुछ भी कहने से पहले, मुझे नहीं लगता कि यह कोड भी संकलित नहीं होगा। क्योंकि जब संकलक वर्ग नहीं ढूंढ सकता है (इसके हटाए जाने के बाद से)। हो सकता है कि आपको javac कमांड का उपयोग करके संकलित करने का प्रयास करते समय कोई त्रुटि हो रही हो। अगर यह मामला बहुत सामान्य है और किसी भी तरह से यह अजीब नहीं है।

और मुझे एक और बिंदु जोड़ने दो .. गुम वर्ग रखने के लिए अपने आयात की जांच करें। अगर यह वहां है तो इसे हटा दें। और हमें बताएं कि क्या हो रहा है।

+2

मैं उम्मीद करता हूं कि आपने जो कहा है, वह सच है, लेकिन ऐसा लगता है कि वह विपरीत व्यवहार का अनुभव करता है (टिप्पणियों में सबकुछ गैर-परेशानी) - परिवर्तनीय घोषणा एक पकड़ा जाता है। – dfb

+0

@spinning_plate .. क्षमा करें दोस्त। असल में मैं गलत था .. – ngesh

0

जब भी लापता वर्ग में पहला संदर्भ (घोषित या उदाहरण बनाते हैं) NoClassDefFoundError फेंक दिया जाता है। अब, एक त्रुटि फेंकना या पकड़ना इस बात पर निर्भर करता है कि आप अपने पहले संदर्भ के लिए प्रयास-पकड़ ब्लॉक का उपयोग करते हैं या नहीं।

1

मैंने दो जावा फाइलें बनाई हैं। Strange1.java कक्षाओं Strange1 और गुम है। Strange2.java Strange2 कक्षा निहित है। मैंने missing.class को हटा दिया। मुझे "मिल गया!" दोनों से।

कृपया निम्न विवरण देखें:

[email protected]:~$ java -version 
java version "1.6.0_25" 
Java(TM) SE Runtime Environment (build 1.6.0_25-b06) 
Java HotSpot(TM) Server VM (build 20.0-b11, mixed mode) 
[email protected]:~$ gedit Strange1.java 
[email protected]:~$ gedit Strange2.java 
[email protected]:~$ javac Strange1.java 
[email protected]:~$ javac Strange2.java 
[email protected]:~$ java Strange1 
[email protected]:~$ java Strange2 
[email protected]:~$ rm Missing.class 
[email protected]:~$ java Strange1 
Got it! 
[email protected]:~$ java Strange2 
Got it! 

मैं उबंटू 11.04 Linux मशीन में यह मार डाला।

तो यह जावा का संस्करण हो सकता है जिसका आप उपयोग कर रहे हैं।

+0

मैंने ग्रहण में कोशिश की, तो आप ग्रहण में कोशिश कर सकते हैं। लेकिन मुझे कमांड में जो मिला वह NoClassDefFoundError दोनों है। मैंने जेडीके 1.5.0_06 और 1.6.0_23 दोनों की कोशिश की है। – Foredoomed

+0

मैंने भी ग्रहण हेलीओस में भी कोशिश की और मुझे "समझ गया!" जैसा कि पहले कहा था। –

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