JavaRush /Курси /JAVA 25 SELF /Вступ до обробки винятків

Вступ до обробки винятків

JAVA 25 SELF
Рівень 11 , Лекція 1
Відкрита

1. Знайомство з винятками

Розпочнемо з простої аналогії. Уявіть, що ваша програма — автомобіль, який їде дорогою. Усе гаразд, аж поки не трапляється щось неочікуване: спустилося колесо, закінчився бензин, двигун перегрівся. Якщо не обробити таку ситуацію (наприклад, не поставити запасне колесо або не заправитися), автомобіль зупиниться й далі не поїде. Так само і в програмі: якщо виняток не обробити, програма аварійно завершить роботу.

Виняток (exception) — це обʼєкт, що створюється у момент виникнення проблеми під час виконання програми. Виняток сигналізує: «Стоп! Щось пішло не так!»

Приклади ситуацій, коли виникають винятки:

  • Ділення на нуль (10 / 0)
  • Спроба звернутися до неіснуючого елемента масиву (arr[999])
  • Відкриття файлу, якого немає на диску
  • Перетворення рядка "abc" на число (Integer.parseInt("abc"))

Важливо: винятки — це не помилки компіляції (наприклад, друкарські помилки в коді), а проблеми, що виникають уже під час виконання програми.

Чому винятки — це добре?

  • Чистіший код: основна логіка програми не захаращується постійними перевірками на кожну дрібницю.
  • Гнучкість: помилки можна обробляти централізовано (наприклад, усі помилки читання файлів — в одному місці).
  • Надійність: програма не «падає» з незрозумілим повідомленням, а повідомляє, що саме сталося.

2. Винятки (Exceptions) і помилки (Errors)

У Java існують два основні типи проблем, що можуть виникати під час виконання програми:

Помилки (Errors)

Помилки — фатальні, невідновні проблеми, що виникають через збої у роботі самої віртуальної машини Java (JVM). Зазвичай вони повʼязані з ресурсами компʼютера або внутрішніми збоями JVM.

Приклади помилок:

  • OutOfMemoryError — закінчилася памʼять.
  • StackOverflowError — переповнення стека (наприклад, через нескінченну рекурсію).

Важливо: зазвичай такі помилки не слід намагатися обробляти в коді програми.

Винятки (Exceptions)

Винятки — проблеми, з якими програма може (і повинна) впоратися. Вони виникають через помилки в логіці програми або через зовнішні фактори (наприклад, користувач ввів неочікуване значення).

Приклади винятків:

  • NullPointerException — спроба використати null як обʼєкт.
  • ArrayIndexOutOfBoundsException — вихід за межі масиву.
  • IOException — помилка під час роботи з файлами.

Винятки у Java бувають двох видів:

  • Перевірювані винятки (checked exceptions) — компілятор вимагає їхньої обробки (наприклад, IOException).
  • Неперевірювані винятки (unchecked exceptions) — компілятор не вимагає їхньої обробки (наприклад, NullPointerException).

Схема: що де розташовано

graph TD
    Throwable --> Error
    Throwable --> Exception
    Exception --> RuntimeException
    Exception --> Checked["(інші Exceptions)"]

    style Throwable fill:#ffa64d,color:#000
    style Exception fill:#ffa64d,color:#000
    style Checked fill:#ffa64d,color:#000
    style Error fill:#ff4d4d,color:#fff
    style RuntimeException fill:#4dff88,color:#000

Пояснення:

  • Throwable — корінь усієї ієрархії помилок і винятків у Java.
  • Error — фатальні помилки JVM, які зазвичай не обробляють.
  • Exception — «звичайні» винятки, які можна і потрібно обробляти.
  • RuntimeException — неперевірювані винятки (помилки програміста).

3. Як це виглядає в коді?

Приклад 1: Ділення на нуль

public class ExceptionDemo 
{
    public static void main(String[] args) 
    {
        int a = 10;
        int b = 0;
        int c = a / b; // Тут виникне ArithmeticException!
        System.out.println("Результат: " + c);
    }
}

Що відбудеться?
Програма завершиться з помилкою, і ви побачите повідомлення:

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at ExceptionDemo.main(ExceptionDemo.java:5)

Приклад 2: Звернення до неіснуючого елемента масиву

int[] arr = {1, 2, 3};
System.out.println(arr[10]); // ArrayIndexOutOfBoundsException

Приклад 3: Робота з файлами

import java.io.FileReader;
import java.io.IOException;

public class FileDemo 
{
    public static void main(String[] args) throws IOException 
    {
        FileReader reader = new FileReader("nofile.txt");     // FileNotFoundException — перевірюваний виняток
        int data = reader.read();
        System.out.println(data);
        reader.close();
    }
}

А тепер розберімося, як коректно обробляти такі виняткові ситуації.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ