Время от времени я сталкиваюсь с разработчиками-новичками, которые застряли на понимании следующих простых исключений и мне приходиться все заново объяснять им. Скорей всего в подобной ситуации оказываются многие опытные Java разработчики, которые помогают новичкам справиться со следующими исключениями. Поэтому я решил написать эту статью и в будущем ссылаться на нее. Комментарии и добавления в список исключений приветствуются.
![6 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.
ClassNotFoundException
: Исключение ClassNotFoundException
это еще одно исключение, из-за которого новичкам, только начинающим программировать на Java, снятся кошмары. Интересно что для среднего разработчика нужно некоторое время чтобы перестать путать ClassNotFoundException
и NoClassDefFoundError
между собой. И поэтому вопрос о разнице этих двух исключений остается одним из часто задаваемых на собеседовании на позицию junior Java разработчика.
ClassNotFoundException
случается когда JVM пытается загрузить определенный класс и не обнаруживает такого же в classpath
. Обычно новички сталкиваются с этим в коде, который подключается к базе данных используя JDBC библиотеку. Пытаясь загрузить драйвер с помощью следующего кода Class.forName( “JDBCdriver”)
. Хороший материал по ClassNotFoundException
можно найти здесь. Так же рекомендуется ознакомиться и понять концепцию загрузчиков классов в Java чтобы эффективно справляться с этим исключением. Вы возможно захотите посмотреть следующую страницу о том как настроить classpath в окружениях Win/Unix. А так, как следует из документации Java, это исключение случается в следующих случаях:
- Когда пытаются загрузить класс используя метод
Class.forName
и файл .class
не существует в classpath
. Это самый частый случай из всех трех.
- Когда загрузчик класса пытается загрузить класс используя метод
loadClass
.
- Когда загрузчик класса пытается загрузить класс используя
findSystemClass
.
NullPointerException
: исключение NullPointerException
понять легче и новички с ним справляются быстрее нежели с двумя предыдущими. В тоже время причину исключения очень легко найти так как приводится номер строки где оно случилось. В первую очередь исключение случается когда JVM пытается обратиться к null в том месте где должен был быть объект. Чаще всего это случается когда JVM пытается вызвать метод используя объект и оказывается что объект равен null
. Другие случаи, как упоминается в документации Java, могут быть следующими:
- Получая доступ к или изменяя метод объекта, который равен
null
.
- Получая длину массива когда он равен
null
.
- Получая доступ к или меняя объекты, которые являются заключенными в массив, который равен
null
.
Самый простой способ избежать этого исключения это добавить проверку на неравенство null
(далее – проверка на null – прим. переводчика). Поэтому рано или поздно разработчик начинает это использовать и тогда проверки на null появляются везде. Интересно что использовать везде проверку на null
не считается примером хорошего программирования. Основная причина почему проверка на null
используется разработчиками это передавать объект null
в случаи ошибки. В место этого пример хорошего программирования, который должен пропагандироваться программистами, это передавать пустой объект когда условие для главной/рабочей ветви программы не удовлетворяется. Это в свою очередь уменьшило бы количество проверок на null
. Все-таки легче говорить нежели применять это на практике.:)
ClassCastException
: это еще одно из исключений, с которым знакомятся новички когда пытаются привести объект к классу, экземпляром которого он не является. Опять же его довольно легко понять, найти причину и исправить. Один из способов избежать этого исключения, когда во время исполнения тип объекта не известен, это использовать проверку является ли объект экземпляром определенного класса: “instanceof
”.
ArrayIndexOutOfBoundsException
: название этого исключения говорит само за себя. Оно случается когда JVM пытается получить доступ к элементу массива используя неверный индекс, на пример, отрицательный (-1) или больший или равный размеру массива. Его легко понять, найти причину и исправить. Следующий пример кода поможет избежать этого исключения: for( index = 0; index < array.length; index++ )
Обратите внимание что индекс начинается с 0 и возрастает до величины на 1 меньше размера массива.
IllegalArgumentException
: Это исключение самое простое, его легко понять, найти его причину и исправить. Оно случается когда JVM пытается передать методу неподходящий аргумент или аргумент неправильного типа.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
проблемузадачу автоматизированным способом. И вот я не пойму то-ли какой-то classpath прописываться надо, но где не пойму, то-ли переменные среды для мейвена нужно прописывать в операционке, то-ли в самом мейвене нужно плагин прописать для того, чтобы зависимости включались в сборку на серваке...