Питання на співбесідах для Java розробників-початківців, частина 2

Питання на співбесідах для Java розробників-початківців, частина 2

  • 20 липня, 2021
  • читати 10 хв

У продовження першої частини серії розглянемо тему про Exception.

Exception:

  • Що таке виключення (Exception)
  • Яка ієрархія винятків в Java
  • Яка різниця між Error, Exception і RuntimeException
  • Як обробити виключення в Java

Рекомендуємо публікацію по темі

Що таке виключення (Exception)

Винятком є подія помилки, яка може статися під час виконання програми і порушити її нормальний потік виконання. Виняток може бути викликаний різними ситуаціями, такими як: неправильні дані, введені користувачем, збій обладнання, брак ресурсів, збій мережевого підключення і т. д.

В Java виключення є об'єктами і успадковуються від класу Object.

Яка ієрархія винятків в Java

Всі виключення в Java успадковуються від класу Throwable.

Клас Throwable має два спадкоємця — Error і Exception. Також є RuntimeException, який успадковується від Exception. Коли йде мова про помилки в Java, зазвичай мають на увазі ці три класи: Error, Exception і RuntimeException. Всі інші помилки успадковуються від цих класів.

Всі виключення діляться на два типи: ті, що перевіряються (checked) і ті, що не перевіряються (unchecked).

Виключення, що перевіряються (checked), представляють собою помилки, які потрібно обробляти в програмі розробнику вручну. До цього типу належать усі нащадки класу Exception (але не RuntimeException), а також клас Throwable.

Виключення checked перевіряються під час компіляції. Це означає, що на етапі компіляції компілятор перевіряє, чи всі винятки були оброблені, якщо ні, то видається помилка компіляції.

Виключення, що не перевіряються (unchecked), представляють собою помилки, які не потрібно обробляти вручну. До них відносять класи Error і RuntimeException (спадкоємець класу Exception) і їх спадкоємці. Це означає, що якщо програма генерує виняток, і навіть якщо ви не обробляли або не оголошували це виняток, програма не видасть помилку компіляції.

Рекомендуємо курс по темі

Яка різниця між Error, Exception і RuntimeException

Error представляє виключення, які, відповідно до специфікації Java, не слід намагатися обробляти у власній програмі, оскільки вони пов'язані з проблемами JVM.

Наприклад, виключення такого роду виникають, якщо закінчилася пам'ять, яка доступна віртуальній машині, і ловити таку помилку не має сенсу, так як JVM не зможе забезпечити додаткову пам'ять. Успадковується від Throwable.

Далі перерахуємо кілька найпоширеніших спадкоємців класу Error:

OutOfMemoryError — виняток виникає, коли не вистачає пам'яті для створення нових об'єктів.

StackOverflowError — виняток виникає, коли відбувається переповнення стека через глибоку рекурсію або відсутность виходу з рекурсії.

NoClassDefFoundError — виняток виникає, коли програма намагається завантажити клас. Наприклад, створення нового об'єкта з використанням виразу «new».

Exception успадковується від Throwable. Exception і всі його підкласи є checked винятками, крім RuntimeException.

Далі перерахуємо кілька найпоширеніших checked винятків, які успадковуються від Exception:

IOException — базовий клас винятків для помилок, пов'язаних з операціями вводу-виводу.

Спадкоємці: FileNotFoundException, UnsupportedEncodingException, EOFException, SocketException і т.д.

SQLException — базовий клас винятків, що виникають при роботі з БД.

Спадкоємці: SQLSyntaxErrorException, SQLFeatureNotSupportedException, SQLTimeoutException і т.д.

ClassNotFoundException — виняток виникає, коли додаток завантажує клас через строкове ім'я (Class.forName, ClassLoader.findSystemClass, ClassLoader.loadClass)

RuntimeException успадковується від Exception. RuntimeException і все його підкласи є unchecked винятками.

Далі перерахуємо кілька найпоширеніших unchecked винятків, які успадковуються від RuntimeException:

NullPointerException — виняток, який виникає при спробі використовувати посилання, яке не вказує ні на одне місце в пам'яті (null). Виклик методу за посиланням null або спроба отримати доступ до поля посилання null викличуть NullPointerException. Дуже поширений тип помилки, означає найчастіше помилку розробника.

ArithmeticException — виняток, який виникає при помилкових арифметичних операціях. Наприклад, поділ на нуль або переповнення int, long і т.д.

ArrayIndexOutOfBoundsException — виняток, який виникає при спробі доступу по неприпустимому індексу в масиві. Індекс або негативний, або більше або дорівнює розміру масиву.

StringIndexOutOfBoundsException — виняток, який виникає при спробі доступу по неприпустимому індексу в рядку. Індекс або негативний, або більше або дорівнює розміру масиву.

ClassCastException — виняток, який виникає при спробі приведення одного типу об'єкта до підкласу іншого типу об'єкта, екземпляром якого він не є.

Як обробити виключення в Java

У Java є п'ять ключових слів для роботи з винятками: try, catch, finally, throw, throws.

Для обробки виключень використовують конструкцію виду try ... catch ... finally і c Java 1.7 можна використовувати конструкцію try-with-resources.

Перший спосіб:

try { 
//код, який може привести до помилки
} 
catch (Exception e ){  
//код, який обробляє виключення
} finally { 
//запускається в будь-якому випадку (блок finally не обов'язковий)
}

Перший спосіб не підходить для роботи з ресурсами.

Другий спосіб:

try (OutputStream stream = openOutputStream()) {
    // щось робимо зі stream
}

try-with-resource можна використовувати тільки над класами, які успадковуються від інтерфейсу Autoclosable. Це синтаксичний цукор, компілятор під час компіляції перетворює try-with-resource в звичайний try-catch-finally і в блоці finally викликає метод close у об'єкта, який вказаний в дужках після слова try.

В наступній частині поговоримо про Java Collections. Дякую всім, хто дочитав)