← Назад к вопросам

Какие знаешь группы исключений Java?

1.2 Junior🔥 211 комментариев
#Основы Java

Комментарии (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

СвойствоCheckedUnchecked
Базовый классExceptionRuntimeException
Обязательная обработкаДа (try-catch или throws)Нет (опционально)
ПричинаВнешние ресурсы, I/OПрограммные ошибки
ПримерыIOException, SQLExceptionNullPointerException, 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 приложения.

Какие знаешь группы исключений Java? | PrepBro