1. Знакомство с исключениями
Давайте начнем с простой аналогии. Представьте, что ваша программа — это автомобиль, который едет по дороге. Всё хорошо, пока вдруг не случается что-то неожиданное: спустило колесо, закончился бензин, перегрелся двигатель. Если не "обработать" эту ситуацию (например, не поставить запаску или не заправиться), машина остановится и дальше не поедет. Точно так же и в программе: если не обработать исключение, программа аварийно завершится.
Исключение (exception) — это объект, который создается в момент возникновения какой-то проблемы во время выполнения программы. Исключение сообщает: «Стоп! Что-то пошло не так!»
Примеры ситуаций, когда возникают исключения:
- Деление на ноль (10 / 0)
- Попытка обратиться к несуществующему элементу массива (arr[999])
- Открытие файла, которого нет на диске
- Преобразование строки "abc" в число (Integer.parseInt("abc"))
Важно: Исключения — это не ошибки компиляции (например, опечатки в коде), а проблемы, которые возникают уже во время работы программы.
Почему исключения — это хорошо?
- Чистый код: Основная логика программы не засоряется постоянными проверками на каждую мелочь.
- Гибкость: Можно централизованно обрабатывать ошибки (например, все ошибки чтения файлов — в одном месте).
- Надёжность: Программа не «падает» с загадочным сообщением, а сообщает, что именно случилось.
2. Исключения (Exceptions) vs Ошибки (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 (checked)
int data = reader.read();
System.out.println(data);
reader.close();
}
}
А вот как красиво обрабатывать такие исключительные ситуации мы сейчас и разберем.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ