-
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 намагається передати методу невідповідний аргумент або аргумент неправильного типу.
gram2005
30 рівень
6 Java винятків, які переслідують новачків
Час від часу я стикаюся з розробниками-новачками, які застрягли на розумінні наступних простих винятків і мені доводиться все заново пояснювати їм. Швидше за все в подібній ситуації виявляється багато досвідчених Java розробників, які допомагають новачкам впоратися з такими винятками. Тому я вирішив написати цю статтю та в майбутньому посилатися на неї. Коментарі та додавання до списку винятків вітаються.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ