大写和NoClassDefFoundError与ClassNotFoundException

Zac*_*ack 5 java classloader platform-independent

我看到跨平台的差异关于Class.forName()何时抛出ClassNotFoundException以及何时抛出NoClassDefFoundError.这个行为在某个地方定义得很好,还是我偶然发现了一个错误?

请考虑以下代码(默认包中的独立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
  }
}
Run Code Online (Sandbox Code Playgroud)

代码在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
Run Code Online (Sandbox Code Playgroud)

它在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)
Run Code Online (Sandbox Code Playgroud)

Windows上的输出是有意义的:因为文件系统不区分大小写,所以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)
Run Code Online (Sandbox Code Playgroud)

Mat*_*teo 3

HFS+(Mac 扩展)通常不区分大小写。自 Mac OS 10.3 起,Apple 引入了 HFSX,它可以区分大小写(但不是默认设置)。如果您没有在磁盘初始化时指定该选项,那么您的卷很可能不区分大小写。

请参阅: http: //en.wikipedia.org/wiki/HFS_Plus