1. Навіщо потрібен try-catch?
Як ви вже знаєте, у програмуванні помилки трапляються постійно: ділення на нуль, некоректне введення даних, відсутній файл тощо. Якщо їх не обробити, програма аварійно завершиться.
Конструкція try-catch дозволяє «спіймати» виняток і запобігти аварійному завершенню програми, коректно обробивши помилку.
Синтаксис конструкції try-catch
try
{
// Код, який може викинути виняток
}
catch (ТипВинятку імʼяЗмінної)
{
// Код для обробки винятку
}
Пояснення:
- try — «спробуй виконати цей код».
- catch — «якщо виникне виняток вказаного типу, оброби його тут».
Як це працює?
Якщо в блоці try виникає виняток, виконання цього блоку одразу переривається, і керування переходить до першого відповідного блоку catch. Якщо винятку не було — блок catch пропускається.
2. Приклад: ділення на нуль
Без обробки винятку
int a = 10;
int b = 0;
int result = a / b; // Тут програма аварійно завершиться!
System.out.println("Результат: " + result); // До цього рядка виконання не дійде
Результат:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Main.main(Main.java:3)
З обробкою за допомогою try-catch
int a = 10;
int b = 0;
try
{
int result = a / b; // Тут може виникнути виняток
System.out.println("Результат: " + result);
}
catch (ArithmeticException e)
{
System.out.println("Помилка: ділення на нуль неможливе!");
}
System.out.println("Програма продовжила роботу.");
Результат:
Помилка: ділення на нуль неможливе!
Програма продовжила роботу.
Пояснення:
- Щойно Java натрапляє на ділення на нуль, вона «викидає» виняток.
- try переривається, і керування переходить у catch.
- Після обробки помилки програма продовжує виконання.
3. Як працює блок catch
У дужках після catch вказується тип винятку (наприклад, ArithmeticException) та імʼя змінної (зазвичай e).
Усередині блоку catch можна дізнатися подробиці про помилку:
- e.getMessage() — короткий опис помилки.
- e.printStackTrace() — докладна інформація (для налагодження).
Приклад:
try
{
int[] arr = new int[2];
int x = arr[10]; // Помилка: такого індексу немає
}
catch (ArrayIndexOutOfBoundsException e)
{
System.out.println("Помилка: " + e.getMessage()); // Виводимо повідомлення про помилку
e.printStackTrace(); // Виводимо у консоль усю інформацію про помилку
}
4. Потік виконання під час винятку
Якщо в блоці try немає помилок — блок catch пропускається.
Якщо в блоці try виникла помилка — виконання блоку переривається в місці помилки, і керування одразу переходить до першого відповідного блоку catch. Усе, що після помилки в try, вже не виконається!
Ілюстрація:
try
{
System.out.println("1. Початок try");
int a = 10 / 0; // Помилка!
System.out.println("2. Після ділення"); // Не виконається
}
catch (ArithmeticException e)
{
System.out.println("3. У блоці catch");
}
System.out.println("4. Після try-catch");
Результат:
1. Початок try
3. У блоці catch
4. Після try-catch
5. Типові помилки під час використання try-catch
Помилка № 1: Занадто широкий catch.
Якщо використовувати catch (Exception e), ви можете перехопити багато неочікуваних помилок, які ви не готові коректно обробляти.
Рішення: ловіть лише ті винятки, які справді очікуються саме тут (наприклад, IOException, SQLException).
Помилка № 2: Порожній catch.
Писати catch (Exception e) {} — означає приховати проблему. Програма може аварійно завершитися в іншому місці або поводитися непередбачувано.
Рішення: принаймні зафіксуйте помилку (e.printStackTrace() або скористайтеся логером).
Помилка № 3: Очікування, що try-catch вирішить будь-яку проблему.
Якщо помилка в логіці програми (наприклад, ділення на нуль, хибний алгоритм) — жоден try-catch не виправить проблему.
Рішення: використовуйте try-catch лише для справді очікуваних ситуацій, а не для маскування помилок.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ