Метод Java Class.forName java.lang.ClassNotFoundException;

Я нашел другую ветку, где у людей была и была решена эта ошибка; однако все они НЕ использовали полные пути к классам. Кажется, я не могу заставить Class.forName работать, и я использую полные пути.

Я протестировал компиляцию из CLI и использование ItelliJ Idea. Оба терпят неудачу с той же ошибкой.

Код (в тестовом каталоге):

package test;
public class Test {
  public static void main(String[] args) {
    Class cls = Class.forName("java.util.ArrayList");
  }
}

Ошибка:

java.lang.ClassNotFoundException; должен быть пойман или объявлен брошенным

Пример выше НЕ работает. Заранее спасибо!


person webish    schedule 16.03.2014    source источник


Ответы (5)


Вы получаете это сообщение, потому что ClassNotFoundException является проверенным исключением. Это означает, что это исключение нельзя игнорировать. Вам нужно либо окружить его конструкцией try/catch и обеспечить обработку исключений, либо добавить в свой метод предложение throws и обработать его в вызываемом объекте.

EDIT: Обратите внимание, что конструкция Class.forName() не разрешается во время компиляции. Когда вы пишете такой оператор, вы говорите JVM искать во время выполнения программы класс, который, возможно, не был загружен. Библиотеки Java подключаются динамически, а не статически, что означает, что их код не включается в код вашей программы, а загружается только по запросу. Вот почему он выдает ClassNotFoundException.

person Mauren    schedule 16.03.2014
comment
Что меня беспокоит, так это то, почему метод Class.forName() в первую очередь вызывает исключение... - person webish; 16.03.2014
comment
@webish, потому что, когда вы используете Class.forName(), вы просите JVM искать внутри загруженных классов имя, которое вообще не гарантируется. Class.forName() никогда не выйдет из строя во время компиляции, поскольку JVM не может знать, что будет загружено при запуске программы. Кстати, я не могу понять, почему вы загружаете ArrayList с Class.forName(), так как он принадлежит стандартной библиотеке. - person Mauren; 16.03.2014
comment
Мне нужно больше репутации, чтобы проголосовать. Сейчас я изучаю java, и на уроках, которые я беру, эта концепция еще не была представлена. Я немного забежал вперед, используя метод, объявляющий проверенное исключение. Спасибо за ответ. - person webish; 16.03.2014


Попробуй это:

try{
  Class cls = Class.forName("java.util.ArrayList");
}catch(ClassNotFoundException e){
  ... do messaging or logging
}

или throw ClassNotFoundException в подписи методов:

public static void main(String[] args) throws ClassNotFoundException {
person Hosein Masbough    schedule 16.03.2014

Есть два варианта:

  1. Окружите блоком try-catch и выполните соответствующую обработку:

    package test;
    public class Test {
      public static void main(String[] args) {
        try {
            Class cls = Class.forName("java.util.ArrayList");
        } catch(ClassNotFoundException e)  {
            System.out.println("This is not a very serious exception, or at least Test knows how to handle it");
        }
      }
    }
    
  2. Выбросьте его за пределы метода в надежде, что какой-нибудь вызывающий метод будет знать, что делать.

    package test;
    public class Test {
      public static void main(String[] args) throws ClassNotFoundException {
        Class cls = Class.forName("java.util.ArrayList");
      }
    }
    
person Willem Van Onsem    schedule 16.03.2014
comment
Эти два примера сработали; однако Морин ответила первой, и я пока не могу проголосовать. Спасибо за помощь! - person webish; 16.03.2014

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

Thread.currentThread().getContextClassLoader().loadClass($YOUR_CLASS_NAME)

Надеюсь, что это может решить вашу проблему, и надеюсь, что кто-то может дать нам объяснение.

person Reed Grey    schedule 28.11.2016