JavaRush /Java блог /Архив info.javarush /6 Java исключений, которые преследуют новичков
gram2005
30 уровень

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

Статья из группы Архив info.javarush
Время от времени я сталкиваюсь с разработчиками-новичками, которые застряли на понимании следующих простых исключений и мне приходиться все заново объяснять им. Скорей всего в подобной ситуации оказываются многие опытные Java разработчики, которые помогают новичкам справиться со следующими исключениями. Поэтому я решил написать эту статью и в будущем ссылаться на нее. Комментарии и добавления в список исключений приветствуются. 6 Java исключений, которые преследуют новичков - 1
  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. Все-таки легче говорить нежели применять это на практике.:)

  4. ClassCastException: это еще одно из исключений, с которым знакомятся новички когда пытаются привести объект к классу, экземпляром которого он не является. Опять же его довольно легко понять, найти причину и исправить. Один из способов избежать этого исключения, когда во время исполнения тип объекта не известен, это использовать проверку является ли объект экземпляром определенного класса: “instanceof”.

  5. ArrayIndexOutOfBoundsException: название этого исключения говорит само за себя. Оно случается когда JVM пытается получить доступ к элементу массива используя неверный индекс, на пример, отрицательный (-1) или больший или равный размеру массива. Его легко понять, найти причину и исправить. Следующий пример кода поможет избежать этого исключения: for( index = 0; index < array.length; index++ )
    Обратите внимание что индекс начинается с 0 и возрастает до величины на 1 меньше размера массива.

  6. IllegalArgumentException: Это исключение самое простое, его легко понять, найти его причину и исправить. Оно случается когда JVM пытается передать методу неподходящий аргумент или аргумент неправильного типа.

Комментарии (3)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Ivan Tyulpin Уровень 32
20 ноября 2019
java.lang.ClassNotFoundException: org.postgresql.Driver Уже неделю бьюсь головой об стену и танцую с бубанми дабы понять эту ошибку Проект JavaEE на сервлетах + TomCat + Maven: запускаю через IntelliJ IDEA, так как прога деполится на сервак TomCat, то классы он ищет в корне\ lib томката. В мейвене все зависимости указаны, но они качаются в локальный репозиторий мейвена и не копируются в в lib томката. Проблема решается ручным добавлением всех необходимых зависимостей в нужную папку, НО... Хочется решить эту проблему задачу автоматизированным способом. И вот я не пойму то-ли какой-то classpath прописываться надо, но где не пойму, то-ли переменные среды для мейвена нужно прописывать в операционке, то-ли в самом мейвене нужно плагин прописать для того, чтобы зависимости включались в сборку на серваке...
MSBlast Уровень 30
29 апреля 2014
NoClassDefFoundError случается тогда, когда виртуальная машина Java (JVM) пытается получить доступ к классу во время исполнения и этот класс не находится, хотя тот же класс находился во время компиляции
Так и хочется спросить не находится где? Также, хоть это и не относится к теме статьи, но поправь орфографию и разметку (пробелы после знаков пунктуации), читать немного неприятно «масив», «все таки», «Так же рекомендуется ознакомиться...», «приводиться номер строки...» и т.д. И ещё вот эти рандомные выделения жирным шрифтом как по мне только затрудняют чтение.