2011-11-12 29 views
5

我看到有關何時Class.forName()拋出ClassNotFoundException和何時拋出NoClassDefFoundError跨平臺的差異。這種行爲在某個地方是非常明確的,還是我偶然發現了一個錯誤?大寫和NoClassDefFoundError vs ClassNotFoundException

考慮下面的代碼(其是在默認包獨立的Java檔案):

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 
    } 
} 

的代碼產生Linux上的預期輸出:

[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 

它產生一個不同的,但在Windows上輸出:

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) 

Windows上的輸出很有意義:Beca使用文件系統不區分大小寫,JVM加載文件dLExceptionType.class,但該文件包含一個不同名稱的類:DLExceptionType

但是,當我在Mac上運行代碼(具有區分大小寫文件系統和比Linux機器更新的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

有一天,我有一個git repo文件的案例問題;在OS X中,它將'foo.rb'和'Foo.rb'視爲同一個文件。 Bash知道區別。 –

回答

3

HFS +(Mac Extended)通常不區分大小寫。由於Mac OS 10.3 Apple推出了可區分大小寫的HFSX(但不是默認設置)。如果您沒有通過磁盤初始化指定選項,那麼您的卷最可能不區分大小寫。

請參見:http://en.wikipedia.org/wiki/HFS_Plus

+0

哇。我已經使用了8年的Mac,並且我從未注意到FS不區分大小寫! – Zack

0

這裏沒有錯誤。你所看到的完全是由文件系統的區分大小寫引起的。

在不區分大小寫的文件系統上加載類dLExceptionType時,JVM可以找到文件dLException.class。但是,它包含的類沒有名稱dLException,這導致NoClassDefFoundError。當試圖在區分大小寫的文件系統上加載這個類時,JVM根本找不到該文件。

A NoClassDefFoundError(wrong name: ...)在消息由JVM拋出時,只要它加載了一個類,該類看起來與讀取的文件名具有不同的名稱。您可以通過重命名類文件並嘗試運行它來嘗試在任何文件系統上執行此操作。

相關問題