Я видел сообщение о том, может ли Class.forName вернуть null здесь , и все, кажется, думают, что это не может (или не будет).Тем не менее, он возвращает ноль для меня с этим кодом:
public void init() {
File binDriectory = new File("./bin/dft");
String[] files = binDriectory.list();
for (String file : files) {
if (file.endsWith(".class")) {
if (file.indexOf("DataReader") > 0) {
//strip off the ".class"
String className = file.substring(0, file.indexOf(".class"));
try {
//load the class
Class readerclass = Class.forName("dft." + className);
//get the file extension of the file type this class deals with
/* NullPointerException thrown here in call to getMthod() */
Method getExtensionMethod = readerClass.getMethod("getFileExtension", null);
String extension = (String) getExtensionMethod.invoke(readerClass.newInstance(), null);
//add the extension and class to the class map
classMap.put(extension, readerClass);
//add the extension to the list of reader file extensions
readerExtensions.add(extension);
}
catch (ClassNotFoundException e) {
System.err.println("**WARNING: class not found: dft." + className);
continue;
}
catch (NoSuchMethodException e) {
System.err.println("**WARNING: class dft." + className + " does "
+ "not contain a getFileExtension() method.");
continue;
}
catch (InstantiationException e) {
System.err.println("**WARNING: could not create an instance of "
+ "class dft." + className);
continue;
}
/* with Java 7, these next two catch blocks can be combined (and they
should) */
catch (InvocationTargetException e) {
System.err.println("**WARNING: could not invoke getFileExtension()"
+ " method from class dft." + className);
continue;
}
catch (IllegalAccessException e) {
System.err.println("**WARNING: could not invoke getFileExtension()"
+ " method from class dft." + className);
continue;
}
System.out.println(className);
}
else if (file.indexOf("DataWriter") > 0) {
System.out.println(file);
}
}
}
}
ClassNotFoundException НЕ выбрасывается, но результат forName () является нулевым.В документации ничего не говорится о возврате null.
Кто-нибудь знает, почему это происходит?Я протестировал вызов forName () в другом проекте, который не использует имя пакета (код выше находится в пакете с именем "dft"), и этот работал нормально.Я думаю, что это как-то связано с этим.Путь к классам тоже подойдет - файлы .class находятся в ... bin / dft, а путь к классам содержит ... / bin.Я даже попытался добавить каталог ... / bin / dft явно в classpath на всякий случай, и он все еще возвращает ноль.