2011-11-12 19 views
5

क्लास.forनाम() क्लास नॉटफाउंड अपवाद को फेंकता है और जब यह NoClassDefFoundError फेंकता है, तो प्लेटफार्मों में अंतर देख रहा हूं। क्या यह व्यवहार कहीं भी अच्छी तरह परिभाषित है, या क्या मैंने एक बग में ठोकर खाई है?पूंजीकरण और NoClassDefFoundError बनाम ClassNotFoundException

निम्नलिखित कोड पर विचार करें (जो डिफ़ॉल्ट पैकेज में एक स्टैंडअलोन जावा फ़ाइल है):

public class DLExceptionType { 

    private static void printFindError(String name) { 
    System.out.print(name + ": "); 
    try { 
     Class.forName(name); 
     System.out.println("** no error **"); 
    } catch (Throwable e) { 
     System.out.println(e); 
    } 
    } 

    public static void main(String[] args) { 
    printFindError("DLExceptionType"); 
    printFindError("dLExceptionType"); // note the mis-capitalization 
    } 
} 

कोड लिनक्स पर उम्मीद उत्पादन का उत्पादन:

[eos18:~]$ java -version DLExceptionType 
java version "1.6.0_26" 
Java(TM) SE Runtime Environment (build 1.6.0_26-b03) 
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode) 
[eos18:~]$ java DLExceptionType 
DLExceptionType: ** no error ** 
dLExceptionType: java.lang.ClassNotFoundException: dLExceptionType 

यह एक अलग पैदा करता है, लेकिन समझने योग्य, विंडोज पर आउटपुट:

java version "1.7.0_01" 
Java(TM) SE Runtime Environment (build 1.7.0_01-b08) 
Java HotSpot(TM) Client VM (build 21.1-b02, mixed mode, sharing) 

Y:\Temp>java DLExceptionType 
DLExceptionType: ** no error ** 
dLExceptionType: java.lang.NoClassDefFoundError: dLExceptionType (wrong name: DLExceptionType) 

विंडोज़ पर आउटपुट समझ में आता है: बेका फ़ाइल सिस्टम का उपयोग केस संवेदनशील नहीं है, JVM फ़ाइल dLExceptionType.class लोड करता है, लेकिन उस फ़ाइल में एक अलग नाम वाला वर्ग होता है: DLExceptionType

हालांकि, जब मैक पर कोड चलाता हूं (जिसमें केस-संवेदी है फाइल सिस्टम और लिनक्स बॉक्स से एक नए JVM) मैं Windows के रूप में ही उत्पादन प्राप्त करें:

$ java -version 
java version "1.6.0_29" 
Java(TM) SE Runtime Environment (build 1.6.0_29-b11-402-10M3527) 
Java HotSpot(TM) 64-Bit Server VM (build 20.4-b02-402, mixed mode) 
$ java DLExceptionType 
DLExceptionType: ** no error ** 
dLExceptionType: java.lang.NoClassDefFoundError: dLExceptionType (wrong name: DLExceptionType) 
+0

मुझे दूसरे दिन एक गिट रेपो फ़ाइल के साथ एक मामला मुद्दा था; ओएस एक्स में यह एक ही फाइल के रूप में 'foo.rb' और' Foo.rb' का इलाज कर रहा था। बैश अंतर जानता था। –

उत्तर

3

HFS + (मैक विस्तारित) आमतौर पर केस संवेदी नहीं है। चूंकि मैक ओएस 10.3 ऐप्पल ने एचएफएसएक्स पेश किया जो मामला संवेदनशील हो सकता है (लेकिन डिफ़ॉल्ट नहीं है)। यदि आपने डिस्क प्रारंभिकरण द्वारा विकल्प निर्दिष्ट नहीं किया है तो आपकी मात्रा सबसे अधिक संभावना असंवेदनशील है।

देखें: http://en.wikipedia.org/wiki/HFS_Plus

+0

वाह। मैं 8 साल के लिए मैक का उपयोग कर रहा हूं और मैंने कभी नहीं देखा कि एफएस केस संवेदनशील नहीं था! – Zack

0

यहां कोई बग है। जो आप देख रहे हैं वह पूरी तरह से फाइल सिस्टम की केस-संवेदनशीलता के कारण होता है।

केस-असंवेदनशील फाइल सिस्टम पर dLExceptionType कक्षा लोड करते समय, JVM फ़ाइल dLException.class फ़ाइल पा सकता है। हालांकि, इसमें शामिल वर्ग का नाम dLException नहीं है, और इससे NoClassDefFoundError का कारण बनता है। इस वर्ग को केस-संवेदी फाइल सिस्टम पर लोड करने का प्रयास करते समय, JVM फ़ाइल को बिल्कुल नहीं ढूंढ सकता है।

संदेश में (wrong name: ...) के साथ एक NoClassDefFoundError JVM जब भी यह एक वर्ग फ़ाइल नाम से पढ़ा गया था करने के लिए एक अलग नाम प्रतीत होता है कि लोड करता है के द्वारा फेंक दिया है। आप कक्षा फ़ाइल का नाम बदलकर और इसे चलाने का प्रयास करके किसी भी फाइल सिस्टम पर इसे आजमा सकते हैं।

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