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

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

1. NoClassDefFoundError: Это одно из тех исключений, которое сообщением Exception in thread “main“ NoClassDefFoundError часто приветствует новых разработчиков в мире Java программирования. Они пишут hello world программу, идут в командную строку и пишут “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, это исключение случается в следующих случаях:

  • -Когда пытаются загрузить класс используя метод Class.forName и файл .class не существует в classpath. Это самый частый случай из всех трех.
  • -Когда загрузчик класса пытается загрузить класс используя метод loadClass.
  • -Когда загрузчик класса пытается загрузить класс используя findSystemClass.

3. NullPointerException: исключение NullPointerException понять легче и новички с ним справляются быстрее нежели с двумя предыдущими. В тоже время причину исключения очень легко найти так как приводится номер строки где оно случилось. В первую очередь исключение случается когда JVM пытается обратиться к null в том месте где должен был быть объект. Чаще всего это случается когда JVM пытается вызвать метод используя объект и оказывается что объект равен null. Другие случаи, как упоминается в документации Java, могут быть следующими:

  • -Получая доступ к или изменяя метод объекта, который равен null.
  • -Получая длину массива когда он равен null.
  • -Получая доступ к или меняя объекты, которые являются заключенными в массив, который равен 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 пытается передать методу неподходящий аргумент или аргумент неправильного типа.

Javarush

Добавить комментарий