Estoy viendo diferencias entre plataformas sobre cuándo Class.forName() arroja ClassNotFoundException y cuándo arroja NoClassDefFoundError. ¿Este comportamiento está bien definido en alguna parte o me he topado con un error?Mayúsculas y NoClassDefFoundError frente a ClassNotFoundException
considere el siguiente código (que es un archivo independiente de Java en el paquete por defecto):
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
}
}
El código produce la salida esperada en 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
Produce una diferente, pero comprensible, salida en 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)
La salida en Windows tiene sentido: Beca utilizar el sistema de archivos no distingue entre mayúsculas y minúsculas, JVM carga el archivo dLExceptionType.class, pero ese archivo contiene una clase con un nombre diferente: DLExceptionType
Sin embargo, cuando ejecuto el código en Mac (con mayúsculas y minúsculas) sistema de archivos y una JVM más reciente que la máquina Linux) consigo el mismo resultado que en 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)
Tuve un problema de caso con un archivo git repo el otro día; en OS X estaba tratando 'foo.rb' y' Foo.rb' como el mismo archivo. Bash sabía la diferencia. –