我看到有關何時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)
有一天,我有一個git repo文件的案例問題;在OS X中,它將'foo.rb'和'Foo.rb'視爲同一個文件。 Bash知道區別。 –