Может ли Class.forName в Java возвращать null? - PullRequest
4 голосов
/ 10 января 2009

Может ли Class.forName в Java когда-либо возвращать ноль, или он всегда выбрасывает ClassNotFoundException или NoClassDefFoundError, если класс не может быть найден?

Ответы [ 4 ]

9 голосов
/ 10 января 2009

В Java Docs говорится, что он выдаст ClassNotFoundException, если класс не может быть найден, поэтому я бы сказал, что он никогда не возвращает ноль.

5 голосов
/ 10 января 2009

Поскольку в документации по этому методу нигде нет упоминания о нуле и поскольку, похоже, не существует ситуации, в которой было бы целесообразно, чтобы метод возвращал ноль вместо генерирования исключения, я думаю, что это довольно безопасно предположим, что он никогда не возвращает ноль.

Это не вызовет NoClassDefFoundError, но может вызвать исключение ClassNotFoundException.

0 голосов
/ 10 января 2009

@ Дэн Дайер не прав, Class.forName может throw NoClassDefFoundError, если класс, который он пытается, получает ошибку ClassNotFoundException в своем статическом инициализаторе. Ниже приведено

class Outer {
  public static final void main(final String[] args) throws Exception{
    Class.forName("Inner");
  }
}

Если вы скомпилируете и запустите это в каталоге без другого файла, вы получите ClassNotFoundException: Inner

Теперь добавьте следующее в тот же каталог, скомпилируйте все и java Outer один раз, чтобы увидеть, что все работает нормально.

class Inner {
  static Inner2 _i2 = new Inner2();
}

class Inner2 {}

Наконец, удалите Inner2.class и перезапустите Outer, вы получите get NoClassDefFoundError: Inner2, caused by ClassNotFoundException: Inner2

0 голосов
/ 10 января 2009

Используя загрузчик классов по умолчанию, вы наверняка не получите нулевые значения. Но, как говорит jdigital, вы можете использовать любое количество пользовательских загрузчиков классов в зависимости от используемой модели безопасности или другого типа загрузчика прокси-сервера (намеренно или нет).

Черт, даже forName может принимать ClassLoader в качестве параметра ...:)

Piko

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