Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Иерархия классов Exception
Корневой класс
Exception наследуется от класса Throwable. Это является фундаментом системы обработки исключений в Java.
public class Exception extends Throwable {
// конструкторы и методы
}
Полная иерархия:
Object
└── Throwable
├── Exception
│ ├── IOException
│ ├── SQLException
│ ├── RuntimeException
│ │ ├── NullPointerException
│ │ ├── ArrayIndexOutOfBoundsException
│ │ ├── IllegalArgumentException
│ │ └── ...
│ └── ...
└── Error
├── OutOfMemoryError
├── StackOverflowError
└── ...
Класс Throwable
Throwable — это базовый класс для всех объектов, которые могут быть выброшены и пойманы оператором try-catch-finally. Он содержит основные методы:
public class Throwable implements Serializable {
// Методы для работы с исключениями:
public String getMessage() // сообщение об ошибке
public void printStackTrace() // вывод стека вызовов
public StackTraceElement[] getStackTrace() // получить стек
public Throwable getCause() // получить причину
public String toString() // строковое представление
}
Две основные ветви Throwable
1. Exception — проверяемые (checked) и непроверяемые (unchecked) исключения
Это исключения, которые приложение может и должно обрабатывать:
try {
File file = new File("data.txt");
FileReader reader = new FileReader(file); // может выбросить FileNotFoundException
} catch (FileNotFoundException e) {
System.out.println("Файл не найден: " + e.getMessage());
}
2. Error — невосстанавливаемые ошибки
Это критические ошибки, которые приложение не должно пытаться обрабатывать:
try {
recursiveMethod(); // может привести к StackOverflowError
} catch (StackOverflowError e) {
// НЕ РЕКОМЕНДУЕТСЯ! Это ошибка, а не исключение
}
Проверяемые (Checked) исключения
Проверяются компилятором. Вы обязаны их обрабатывать или объявлять в throws:
// Exception и его подклассы (кроме RuntimeException)
public class FileReader {
public FileReader(String fileName) throws FileNotFoundException {
// ...
}
}
// Обязательно:
public void readFile() throws FileNotFoundException {
FileReader reader = new FileReader("file.txt");
}
// Или ловим:
public void readFile() {
try {
FileReader reader = new FileReader("file.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
Непроверяемые (Unchecked) исключения
Вложены в RuntimeException. Компилятор не требует их обработки:
public class RuntimeException extends Exception {
// ...
}
// NullPointerException
String str = null;
int length = str.length(); // RuntimeException, не нужно ловить
// ArrayIndexOutOfBoundsException
int[] array = new int[5];
int value = array[10]; // RuntimeException
// IllegalArgumentException
public void setAge(int age) {
if (age < 0) {
throw new IllegalArgumentException("Возраст не может быть отрицательным");
}
}
Error — невосстанавливаемые ошибки
Это ошибки, связанные с окружением, а не логикой приложения:
public class Error extends Throwable {
// ...
}
// OutOfMemoryError
List<byte[]> list = new ArrayList<>();
while (true) {
list.add(new byte[1024 * 1024]); // Error: OutOfMemoryError
}
// StackOverflowError
private void recursion() {
recursion(); // Error: StackOverflowError
}
Основные подклассы Exception
// Проверяемые:
throws IOException // ошибки ввода-вывода
throws SQLException // ошибки БД
throws ClassNotFoundException // класс не найден
throws InterruptedException // поток прерван
// Непроверяемые (RuntimeException):
throws NullPointerException // null где не ожидается
throws ArrayIndexOutOfBoundsException // индекс за границами массива
throws ClassCastException // неправильное преобразование типа
throws IllegalArgumentException // неправильный аргумент
throws IllegalStateException // неправильное состояние
Практический пример
public class ExceptionHierarchyExample {
public static void main(String[] args) {
// Проверяемое исключение
try {
readFile("data.txt");
} catch (IOException e) {
System.err.println("Ошибка ввода-вывода: " + e.getMessage());
}
// Непроверяемое исключение (необязательно ловить)
try {
int[] arr = {1, 2, 3};
System.out.println(arr[5]);
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println("Ошибка индекса: " + e.getMessage());
}
}
// Объявляем проверяемое исключение
static void readFile(String fileName) throws IOException {
FileReader reader = new FileReader(fileName);
}
}
Итог
- Exception наследуется от Throwable
- Exception разделяется на:
- Checked (проверяемые) — обязательно обрабатывать
- Unchecked (RuntimeException) — опционально
- Throwable имеет вторую ветвь: Error — невосстанавливаемые критические ошибки
- Правильное использование иерархии исключений — ключ к надёжному коду