JavaRush /Java блог /Архив info.javarush /Перевод: 6 Java Exceptions которые преследуют новичков в ...
profeg
18 уровень

Перевод: 6 Java Exceptions которые преследуют новичков в Java.

Статья из группы Архив info.javarush

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

(Оригинал) (Я сам новичок и в Java и в English, поэтому буду рад критике и помощи) И раньше и сейчас, я сталкиваюсь со многими новичками в Java, у которых возникает проблема с несколькими часто встречающимися исключениями, которые я должен объяснять в очередной раз. Я верю что такая же проблема у других Senior Java разработчиков, которые пытаются помочь новичкам справиться с этими исключениями. Таким образом я писал эту статью и для своего развития. Пожалуйста не стесняйтесь комментировать эту статью или добавлять исключения в нижеследующий список.
1. NoClassDefFoundError
Это одно из тех исключений, с таким сообщением как «Exception in thread “main” NoClassDefFoundError», которое чаще всего встречает новичков Java разработчиков в мире программирования Java. Новичок пишет программу выводящую «Hello world!», переходит в командную строку, набирает «java …» , жмет enter и БАЦ! =). И выяснение как же заставить программу вывести «Hello world!» на монитор, занимает какое-то время. NoClassDefFoundError происходит, когда виртуальная машина Java (JVM), пытается получить доступ к классу во время запуска и класс не находит, несмотря на то, что этот же класс был найден во время компиляции. Наиболее часто это исключение происходит во время попытки выполнить программу с помощью команды «java» , а classpath не установлен как надо. Вот описание причин по которым возникает это исключение.
  • Класс не доступен в -classpath.
  • Переопределена переменная среды CLASSPATH. Проверить ее наличие и корректность можно с помощью команды Windows «set» .
Более подробно решение проблемы описано здесь.
Причем надо понять разницу между переменной окружения CLASSPATH и ключом интерперетатора -classpath. Профессионалы не советуют использовать CLASSPATH. Наилучшим способом считается передача ключа -classpath интерпретатору.
2. ClassNotFoundException
ClassNotFoundException это еще одно исключение, которое становиться кошмаром для новичка, как только он начинает программировать. Интересно, что у среднестатистического Java разработчика часто возникает путаница между ClassNotFoundException и NoClassDefFoundError исключениями. И, таким образом, разница между этими двумя исключениями остается одним из наиболее часто задаваемых вопросов в собеседованиях на позицию Junior-a. ClassNotFoundException возникает когда JVM пытается загрузить определенный класс и не находит его в classpath. Одно из распространенных мест, где новичок Java разработчик сталкивается с ним впервые, подключение к базе данных, используя JDBC библиотеку. Там мы попробуем загрузить драйвер используя код типа Class.forName("JDBCdriver"). Хорошая статья про ClassNotFoundException лежит здесь. Попытаться понять концепцию Java Classloaders это наиболее эффективный метод разобраться с этой проблемой. Вы можете почитать как настроить Java classpath в Win / Unix среде. Как указанно в java docs, исключение происходит в следующих случаях:
  • При попытке загрузить класс, используя метод Class.forName, а файл .class отсутствует в classpath. Это наиболее распространенный сценарий из трех перечисленных здесь.
  • Когда загрузчик классов пытается загрузить класс с помощью метода loadClass.
  • Когда загрузчик классов пытается загрузить класс, используя findSystemClass.
3. NullPointerException
Это исключение проще для понимания новичками чем первые два. Тем более это исключение легко идентифицируется т.к. при его возникновении, в сообщении о возникновении исключения указывается номер строки в программе, где оно произошло. Это исключение возникает когда JVM пытается получить доступ к объекту или пытается вызвать метод объекта, а вместо ссылки на объект получает null. Так же в Java Doc указаны следующие причины:
  • Доступ или изменения метода на объекте, который является недействительным. (т.е. вместо ссылки на объект JVM получает null)
  • Получение длину массива, когда он является недействительным. (не инициализированный к примеру)
  • Попытка доступа к несуществующему элементу массива типа Object. (т.е. Когда вместо ссылки на объект элемент массива содержит null)
Наиболее простой метод избежать этого исключения, использование проверки на не-NULL. Тем не менее, рано или поздно, это становится практикой Java разработки, и вы будете везде находить проверки на не-NULL.Интересно, что вставлять везде проверки на не-NULL, не считается хорошим стилем программирования. И основной причиной использования проверки не-NULL, является то, что разработчик хочет передать null объект в случае сбоя или ошибки. Вместо этого хорошая практики программирования, которую должны использовать программисты, это возврат пустого объекта, вместо значения null, как основная логика поведения программы в случае ошибки. Тем не менее, принятие этой практики программирования сложнее чем кажется.
Про это есть хорошая статья на нашем ресурсе.
4. ClassCastException
Это еще одно знакомое новичкам исключение, возникающее при попытки приведения объекта к классу , который не является его подклассом. Опять же, это довольно легко понять, идентифицировать и просто исправить. Один из путей избежать этого исключения, когда тип объекта неизвестен во время выполнения, является использование "InstanceOf", для проверки того, что объект является экземпляром определенного класса.
5. ArrayIndexOutOfBoundsException
Это исключение не требует пояснений и происходит, когда JVM пытается получить доступ к элементу массива с несуществующим индексом, к примеру отрицательным (-1) или больше или равному размеру массива. Оно довольно легко понимается, определяется и исправляется. К примеру при создании цикла for (i = 0; i <= cmd_stack.length; i++) System.out.println(cmd_stack[i]); возникает исключение, т. к. в массиве индексы идут с 0, а метод length возвращает количество элементов, а количество больше на 1 чем значение последнего индекса. Правильно использовать for (i = 0; i < cmd_stack.length; i++) System.out.println(cmd_stack[i]);
6. IllegalArgumentException
Это исключение менее распространено и довольно легко понимается, выявляется и устраняется. Оно возникает когда JVM пытается вызвать несуществующий метод, или метод с неверным аргументом.
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Иван Борзов Уровень 22
4 ноября 2019
А где же ошибка преобразования типов?