Рекурсивні функції. Введення в обробку винятків
Рекурсивні функції. Введення в обробку винятків – курс java
1. Рекурсивні функції
Рекурсія — це техніка, коли метод викликає сам себе для вирішення завдання. У рекурсивних функціях завжди має бути базовий випадок, який зупиняє рекурсію, і рекурсивний крок, який наближається до цього базового випадку.
Складові рекурсивної функції:
Базовий випадок: Умова, коли функція більше не повинна викликати сама себе, зупиняючи рекурсію.
Рекурсивний випадок: Виклик функції із зміненими параметрами, щоб наблизитися до базового випадку.
Приклад рекурсивної функції — Факторіал числа:
Факторіал числа `n` (позначається як `n!`) — це добуток усіх цілих чисел від 1 до `n`. Визначення факторіала можна записати рекурсивно:
– `0! = 1` (базовий випадок),
– `n! = n * (n-1)!`, якщо `n > 0` (рекурсивний випадок).
public int factorial(int n) {
if (n == 0) { // Базовий випадок
return 1;
}
return n * factorial(n – 1); // Рекурсивний виклик
}
int result = factorial(5); // Виведе 120, оскільки 5! = 5 * 4 * 3 * 2 * 1
Інший приклад — Числа Фібоначчі:
Числа Фібоначчі — це послідовність, у якій кожен елемент є сумою двох попередніх:
– `F(0) = 0` (базовий випадок),
– `F(1) = 1` (базовий випадок),
– `F(n) = F(n-1) + F(n-2)` для всіх `n > 1` (рекурсивний випадок).
public int fibonacci(int n) {
if (n == 0) {
return 0; // Базовий випадок
}
if (n == 1) {
return 1; // Базовий випадок
}
return fibonacci(n – 1) + fibonacci(n – 2); // Рекурсивний виклик
}
int result = fibonacci(6); // Виведе 8 (послідовність: 0, 1, 1, 2, 3, 5, 8)
Особливості рекурсивних функцій:
– Рекурсія корисна для вирішення задач, які мають подібні підзадачі.
– Слід обережно використовувати рекурсію, щоб уникнути нескінченної рекурсії, коли базовий випадок ніколи не досягається, що може призвести до помилки StackOverflowError.
2. Введення в обробку винятків (Exceptions)
Винятки (exceptions) — це механізм обробки помилок у Java. Вони виникають під час виконання програми, коли щось пішло не так (наприклад, ділення на нуль, спроба доступу до неіснуючого елемента масиву тощо). Якщо виняток не обробляється, програма аварійно завершує свою роботу.
Структура обробки винятків:
У Java використовуються блоки `try`, `catch`, `finally` і `throw` для обробки винятків.
– try: Код, який може викликати виняток, обертається у блок `try`.
– catch: Обробляє виняток, якщо він виник у блоці `try`.
– finally: Виконується завжди після виконання блоку `try`/`catch`, незалежно від того, чи був виняток (опціональний).
– throw: Використовується для явного викидання винятків.
Приклад обробки винятку:
public void divide(int a, int b) {
try {
int result = a / b; // Може виникнути виняток при b == 0
System.out.println(“Результат: ” + result);
} catch (ArithmeticException e) {
System.out.println(“Помилка: Ділення на нуль!”);
} finally {
System.out.println(“Операція завершена.”);
}
}
У цьому прикладі:
– Якщо `b == 0`, виникне ArithmeticException, і його буде оброблено у блоці `catch`.
– Блок `finally` завжди виконається, незалежно від того, був виняток чи ні.
Обробка кількох винятків:
Можна обробляти різні типи винятків у кількох блоках `catch`.
public void handleExceptions(String str, int[] arr) {
try {
System.out.println(“Довжина рядка: ” + str.length()); // Може виникнути NullPointerException
System.out.println(“Елемент масиву: ” + arr[5]); // Може виникнути ArrayIndexOutOfBoundsException
} catch (NullPointerException e) {
System.out.println(“Помилка: Рядок є null!”);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println(“Помилка: Неправильний індекс масиву!”);
} finally {
System.out.println(“Операція завершена.”);
}
}
Класи винятків у Java:
Всі винятки є нащадками класу Throwable. Є два основні підкласи:
1. Exception — оброблювані винятки (checked exceptions). Їх потрібно або обробляти в коді, або оголошувати, що метод може їх кидати.
2. RuntimeException — необроблювані винятки (unchecked exceptions), які не вимагають обов’язкової обробки.
Явне викидання винятків:
Ви можете явно кидати винятки за допомогою оператора `throw`.
public void checkAge(int age) {
if (age < 18) {
throw new IllegalArgumentException(“Вік має бути 18 або більше!”);
}
System.out.println(“Вік допустимий.”);
}
Важливість обробки винятків:
1. Забезпечення надійності програми: Програма не завершується аварійно при виникненні помилки.
2. Локалізація помилок: Полегшує пошук та виправлення помилок у коді.
3. Чистий код: Відокремлює нормальну логіку програми від обробки помилок.
Висновок:
– Рекурсивні функції — це методи, які викликають самі себе. Важливо правильно визначати базовий і рекурсивний випадки, щоб уникнути помилок.
– Обробка винятків у Java дозволяє керувати помилками під час виконання програми, забезпечуючи стабільність та передбачуваність коду.