Class.forName возвращает ноль - PullRequest
       3

Class.forName возвращает ноль

3 голосов
/ 03 ноября 2011

Я видел сообщение о том, может ли 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 на всякий случай, и он все еще возвращает ноль.

Ответы [ 2 ]

9 голосов
/ 03 ноября 2011

Вы присваиваете значение, возвращаемое forName

readerclass (строчная C)

но звонит getMethod с

readerClass (заглавная буква C)

, что, вероятно, является неинициализированным полем.

В Java учитывается регистр.

3 голосов
/ 03 ноября 2011

Если класс находится в пути к классу вашего проекта (даже если это один из классов вашего текущего проекта, который уже скомпилирован) Class.forName(...) должно работать.

Единственный способ, которым Class.forName может выдать исключение NullPointerException, - это если класс, который вы пытаетесь загрузить, имеет инициализированный статический объект, который сам по какой-то причине вызывает NPE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...