Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Группы исключений в Java
Исключения в Java организованы в иерархию, которая делится на несколько основных групп. Понимание этой иерархии критично для правильной обработки ошибок.
Иерархия исключений Java
Throwable
├── Error (неотвратимые ошибки)
│ ├── OutOfMemoryError
│ ├── StackOverflowError
│ └── VirtualMachineError
├── Exception (исключения)
│ ├── Checked Exception (проверяемые)
│ │ ├── IOException
│ │ ├── SQLException
│ │ └── ClassNotFoundException
│ └── Unchecked Exception (непроверяемые)
│ ├── RuntimeException
│ │ ├── NullPointerException
│ │ ├── ArrayIndexOutOfBoundsException
│ │ └── ClassCastException
│ └── Другие
1. Error — Критические ошибки JVM
Это ошибки, которые невозможно обработать. Обычно программа прекращает работу.
// OutOfMemoryError — недостаточно памяти
try {
List<byte[]> list = new ArrayList<>();
while (true) {
list.add(new byte[1024 * 1024]); // 1MB
}
} catch (OutOfMemoryError e) {
System.out.println("Не хватает памяти");
// На практике обработать нельзя
}
// StackOverflowError — переполнение стека
public class StackExample {
public static void recursion() {
recursion(); // Бесконечная рекурсия
}
}
// VirtualMachineError — критическая ошибка JVM
try {
// Код
} catch (VirtualMachineError e) {
System.out.println("JVM ошибка");
}
Когда возникает: Критические состояния JVM, которые редко обрабатываются.
2. Checked Exceptions (Проверяемые исключения)
Это исключения, которые компилятор заставляет обработать явно. Они возникают при работе с внешними ресурсами.
// IOException — ошибка ввода-вывода
import java.io.*;
public class FileExample {
public void readFile(String filename) throws IOException {
try (FileReader reader = new FileReader(filename)) {
int character;
while ((character = reader.read()) != -1) {
System.out.print((char) character);
}
} // Не обязательно ловить IOException, можно пробросить выше
}
}
// SQLException — ошибка при работе с БД
import java.sql.*;
public class DatabaseExample {
public void queryDatabase() throws SQLException {
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/db");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
// Должны обработать SQLException
}
}
// ClassNotFoundException — класс не найден при динамической загрузке
public class ReflectionExample {
public void loadClass(String className) throws ClassNotFoundException {
Class<?> clazz = Class.forName(className);
}
}
Обработка Checked Exception:
public void handleChecked() {
try {
readFile("data.txt");
} catch (IOException e) {
System.err.println("Ошибка чтения файла: " + e.getMessage());
// Логирование, обработка
}
}
3. Unchecked Exceptions (Непроверяемые исключения)
RuntimeException — программные ошибки
Эти исключения возникают из-за ошибок в коде, а не из-за внешних условий.
// NullPointerException — попытка доступа к методу null объекта
public class NullPointerExample {
public void example() {
String str = null;
str.length(); // NullPointerException
}
}
// ArrayIndexOutOfBoundsException — доступ за границы массива
public class ArrayExample {
public void example() {
int[] array = {1, 2, 3};
System.out.println(array[10]); // ArrayIndexOutOfBoundsException
}
}
// ClassCastException — неправильная приведение типа
public class CastExample {
public void example() {
Object obj = "Hello";
Integer num = (Integer) obj; // ClassCastException
}
}
// IllegalArgumentException — недопустимый аргумент
public class ValidationExample {
public void setAge(int age) {
if (age < 0) {
throw new IllegalArgumentException("Возраст не может быть отрицательным");
}
}
}
// NumberFormatException — ошибка при преобразовании строки в число
public class NumberExample {
public void example() {
int num = Integer.parseInt("abc"); // NumberFormatException
}
}
// ArithmeticException — арифметическая ошибка (деление на 0)
public class MathExample {
public void divide(int a, int b) {
int result = a / b; // ArithmeticException если b == 0
}
}
Сравнение Checked и Unchecked
| Свойство | Checked | Unchecked |
|---|---|---|
| Базовый класс | Exception | RuntimeException |
| Обязательная обработка | Да (try-catch или throws) | Нет (опционально) |
| Причина | Внешние ресурсы, I/O | Программные ошибки |
| Примеры | IOException, SQLException | NullPointerException, IllegalArgumentException |
4. Кастомные исключения
// Собственное проверяемое исключение
public class InsufficientFundsException extends Exception {
private double amount;
public InsufficientFundsException(String message, double amount) {
super(message);
this.amount = amount;
}
public double getAmount() {
return amount;
}
}
// Собственное непроверяемое исключение
public class InvalidUserException extends RuntimeException {
public InvalidUserException(String message) {
super(message);
}
public InvalidUserException(String message, Throwable cause) {
super(message, cause);
}
}
// Использование
public class BankAccount {
private double balance = 1000;
public void withdraw(double amount) throws InsufficientFundsException {
if (amount > balance) {
throw new InsufficientFundsException(
"Недостаточно средств",
amount - balance
);
}
balance -= amount;
}
}
public class UserService {
public void validateUser(String username) {
if (username == null || username.isEmpty()) {
throw new InvalidUserException("Username не может быть пустым");
}
}
}
Лучшие практики обработки исключений
// ❌ Плохо — ловишь слишком широко
try {
// код
} catch (Exception e) {
// скрываешь все ошибки
}
// ✅ Хорошо — ловишь конкретные исключения
try {
readFile("data.txt");
} catch (FileNotFoundException e) {
System.out.println("Файл не найден");
} catch (IOException e) {
System.out.println("Ошибка чтения");
}
// ✅ Хорошо — используешь try-with-resources
try (FileReader reader = new FileReader("file.txt")) {
// reader закроется автоматически
} catch (IOException e) {
System.err.println("Ошибка: " + e.getMessage());
}
// ✅ Хорошо — логируешь с контекстом
try {
processData();
} catch (IOException e) {
logger.error("Ошибка при обработке данных из {}", filename, e);
throw new DataProcessingException("Не удалось обработать данные", e);
}
Понимание групп исключений и правильная их обработка — фундаментальный навык Java разработчика, обеспечивающий надёжность и maintainability приложения.