Java lang classnotfoundexception and noclassdeffounderror

Difference between ClassNotFoundException vs NoClassDefFoundError in Java

ClassNotFoundException vs NoClassDefFoundError
Though both of these errors are related to missing classes in the classpath, the main difference between them is their root cause. ClassNotFoundExcpetion comes when you try to load a class at runtime by using Class.forName() or loadClass() and requested class is not present in the classpath for example when you try to load MySQL or Oracle driver class and their JAR is not available, while in case of NoClassDefFoundError requested class was present at compile time but not available at runtime. Sometimes due to an exception during class initialization e.g. exception from static block causes NoClassDefFoundError when a failed-to-load class was later referenced by the runtime.

In last few weeks I have been facing a cluster of ClassNotFoundException and NoClassDefFoundError while setting up a new project in Java. This new Java project has lots of dependency on various jars and some of the jars even contains the same name of the file which makes my problem even more problematic.

While working with NoClassDefFoundError and ClassNotFoundException I thought to document my experience and I have already shared some on 3 ways to resolve NoClassDefFoundError in Java and how to resolve ClassNotFoundException in Java. in this article though the focus will be on similarities and differences between java.lang.ClassNotFoundException and java.lang.NoClassDefFoundError in Java.

Читайте также:  Java maven settings xml

NoClassDefFoundError vs ClassNotFoundException

Before seeing the differences between ClassNotFoundException and NoClassDefFoundError let’s see some similarities which are main reason of confusion between these two errors:

1) Both NoClassDefFoundError and ClassNotFoundException are related to unavailability of a class at run-time.

2) Both ClassNotFoundException and NoClassDefFoundError are related to Java classpath.

Now let’s see the difference between NoClassDefFoundError and ClassNotFoundException :

Difference between ClassNotFoundException and NoClassDefFoundError in Java

1. Root Cause

ClassNotFoundException comes in java if we try to load a class at run-time using with Class.forName() or ClassLoader.loadClass() or ClassLoader.findSystemClass() method and requested class is not available in Java.

The most of the time it looks like that we have the class in classpath but eventually it turns out to be an issue related to classpath and application may not be using classpath what we think it was using like classpath defined in jar’s manifest file will take precedence over CLASSPATH or -cp option, for more details see How Classpath works in Java.

On the other hand NoClassDefFoundError is little different than ClassNotFoundException, in this case culprit class was present during compile time and let’s application to compile successfully and linked successfully but not available during run-time due to various reason.

2) Exception vs Error

ClassNotFoundException is a checked Exception derived directly from java.lang.Exception class and you need to provide explicit handling for it while NoClassDefFoundError is an Error derived from LinkageError .

3) ClassLoaders

If you are using ClassLoader in Java and have two class loaders then if a ClassLoader tries to access a class that is loaded by another classloader will result in ClassNoFoundException .

4) Explicit vs Implicit Class Loading

The ClassNotFoundException comes up when there is an explicit loading of the class is involved by providing the name of the class at runtime using ClassLoader.loadClass() , Class.forName() , while NoClassDefFoundError is a result of implicit loading of class because of a method call from that class or any variable access.

Please let us know if you are aware of any other difference between NoClassDefFoundError and ClassNotFoundException in Java, I would be happy to incorporate those.

Источник

6 Java исключений, которые преследуют новичков

Java-университет

6 Java исключений, которые преследуют новичков - 1

Время от времени я сталкиваюсь с разработчиками-новичками, которые застряли на понимании следующих простых исключений и мне приходиться все заново объяснять им. Скорей всего в подобной ситуации оказываются многие опытные Java разработчики, которые помогают новичкам справиться со следующими исключениями. Поэтому я решил написать эту статью и в будущем ссылаться на нее. Комментарии и добавления в список исключений приветствуются.

  1. NoClassDefFoundError : Это одно из тех исключений, которое сообщением Exception in thread “main“ NoClassDefFoundError часто приветствует новых разработчиков в мире Java программирования. Они пишут helloworld-программу, идут в командную строку и пишут “java“ — команду для выполнения и «БАМ»:-) Немного времени спустя новички поймут как исправить это исключение и увидят как выводиться их hello world. NoClassDefFoundError случается тогда, когда виртуальная машина Java (JVM) пытается получить доступ к классу во время исполнения и этот класс не находится, хотя тот же класс находился во время компиляции. Чаще всего это исключение случается при запуске Java программы через команду “java“ с неверным значением параметра classpath . [ Classpath – это параметр, который задается через командную строку или через переменную окружения, указывающий виртуальной Java машине или Java компилятору где искать классы или пакеты объявленные пользователем – прим. переводчика] Возможные причины исключения:
    • Класс недоступен в Classpath .
    • Часто скрипт, который исполняется при запуске операционной системы, изменяет значение переменной окружению classpath . Это можно проверить выполнив команду “ set ” в командной строке в Windows и посмотрев включено ли определение класса в значение classpath . При желании дальнейшее изучение этого исключения можно продолжить в блоге Javarevisited.
  2. ClassNotFoundException : Исключение ClassNotFoundException это еще одно исключение, из-за которого новичкам, только начинающим программировать на Java, снятся кошмары. Интересно что для среднего разработчика нужно некоторое время чтобы перестать путать ClassNotFoundException и NoClassDefFoundError между собой. И поэтому вопрос о разнице этих двух исключений остается одним из часто задаваемых на собеседовании на позицию junior Java разработчика.
    ClassNotFoundException случается когда JVM пытается загрузить определенный класс и не обнаруживает такого же в classpath . Обычно новички сталкиваются с этим в коде, который подключается к базе данных используя JDBC библиотеку. Пытаясь загрузить драйвер с помощью следующего кода Class.forName( “JDBCdriver”) . Хороший материал по ClassNotFoundException можно найти здесь. Так же рекомендуется ознакомиться и понять концепцию загрузчиков классов в Java чтобы эффективно справляться с этим исключением. Вы возможно захотите посмотреть следующую страницу о том как настроить classpath в окружениях Win/Unix. А так, как следует из документации Java, это исключение случается в следующих случаях:
    1. Когда пытаются загрузить класс используя метод Class.forName и файл .class не существует в classpath . Это самый частый случай из всех трех.
    2. Когда загрузчик класса пытается загрузить класс используя метод loadClass .
    3. Когда загрузчик класса пытается загрузить класс используя findSystemClass .
  3. NullPointerException : исключение NullPointerException понять легче и новички с ним справляются быстрее нежели с двумя предыдущими. В тоже время причину исключения очень легко найти так как приводится номер строки где оно случилось. В первую очередь исключение случается когда JVM пытается обратиться к null в том месте где должен был быть объект. Чаще всего это случается когда JVM пытается вызвать метод используя объект и оказывается что объект равен null . Другие случаи, как упоминается в документации Java, могут быть следующими:
    1. Получая доступ к или изменяя метод объекта, который равен null .
    2. Получая длину массива когда он равен null .
    3. Получая доступ к или меняя объекты, которые являются заключенными в массив, который равен null .

    Самый простой способ избежать этого исключения это добавить проверку на неравенство null (далее – проверка на null – прим. переводчика). Поэтому рано или поздно разработчик начинает это использовать и тогда проверки на null появляются везде. Интересно что использовать везде проверку на null не считается примером хорошего программирования. Основная причина почему проверка на null используется разработчиками это передавать объект null в случаи ошибки. В место этого пример хорошего программирования, который должен пропагандироваться программистами, это передавать пустой объект когда условие для главной/рабочей ветви программы не удовлетворяется. Это в свою очередь уменьшило бы количество проверок на null . Все-таки легче говорить нежели применять это на практике.:)

    Источник

    ClassNotFoundException vs. NoClassDefFoundError

    Join the DZone community and get the full member experience.

    ClassNotFoundException and NoClassDefFoundError occur when a particular class is not found at runtime. However, they occur at different scenarios.

    ClassNotFoundException is an exception that occurs when you try to load a class at run time using Class.forName() or loadClass() methods and mentioned classes are not found in the classpath.

    NoClassDefFoundError is an error that occurs when a particular class is present at compile time, but was missing at run time.

    ClassNotFoundException

    ClassNotFoundException is a runtime exception that is thrown when an application tries to load a class at runtime using the Class.forName() or loadClass() or findSystemClass() methods ,and the class with specified name are not found in the classpath. For example, you may have come across this exception when you try to connect to MySQL or Oracle databases and you have not updated the classpath with required JAR files. Most of the time, this exception occurs when you try to run an application without updating the classpath with required JAR files.

    For example, the below program will throw ClassNotFoundException if the mentioned class “oracle.jdbc.driver.OracleDriver” is not found in the classpath.

    public class MainClass < public static void main(String[] args) < try < Class.forName("oracle.jdbc.driver.OracleDriver"); >catch (ClassNotFoundException e) < e.printStackTrace(); >> > 

    If you run the above program without updating the classpath with required JAR files, you will get an exception akin to:

    java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at pack1.MainClass.main(MainClass.java:17)

    NoClassDefFoundError

    NoClassDefFoundError is an error that is thrown when the Java Runtime System tries to load the definition of a class, and that class definition is no longer available. The required class definition was present at compile time, but it was missing at runtime. For example, compile the program below.

    When you compile the above program, two .class files will be generated. One is A.class and another one is B.class. If you remove the A.class file and run the B.class file, Java Runtime System will throw NoClassDefFoundError like below:

    Exception in thread "main" java.lang.NoClassDefFoundError: A at MainClass.main(MainClass.java:10) Caused by: java.lang.ClassNotFoundException: A at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

    Recap

    ClassNotFoundException

    NoClassDefFoundError

    It is an exception. It is of type java.lang.Exception.

    It is an error. It is of type java.lang.Error.

    It occurs when an application tries to load a class at run time which is not updated in the classpath.

    It occurs when java runtime system doesn’t find a class definition, which is present at compile time, but missing at run time.

    It is thrown by the application itself. It is thrown by the methods like Class.forName(), loadClass() and findSystemClass().

    It is thrown by the Java Runtime System.

    It occurs when classpath is not updated with required JAR files.

    It occurs when required class definition is missing at runtime.

    Opinions expressed by DZone contributors are their own.

    Источник

Оцените статью