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

Что такое проверяемое исключение?

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

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Проверяемые исключения (Checked Exceptions)

Проверяемое исключение — это исключение, которое компилятор Java требует явно обработать или объявить в сигнатуре метода. Это часть контракта метода.

Иерархия исключений

Throwable ├── Exception (проверяемые) │ ├── IOException │ ├── SQLException │ ├── ClassNotFoundException │ └── FileNotFoundException └── RuntimeException (непроверяемые)

    ├── NullPointerException
    └── ArrayIndexOutOfBoundsException

Проверяемые vs Непроверяемые

// ПРОВЕРЯЕМОЕ — IOException
public String readFile(String path) throws IOException {
    FileReader reader = new FileReader(path);
    return reader.read() + "";
}

// НЕПРОВЕРЯЕМОЕ — NullPointerException
public int divide(int a, int b) {
    return a / b;  // Не нужно throws
}

Обязательная обработка

// Вариант 1: Try-catch
public void process(String path) {
    try {
        FileReader reader = new FileReader(path);
    } catch (FileNotFoundException e) {
        System.out.println("File not found");
    }
}

// Вариант 2: Объявление throws
public void process(String path) throws IOException {
    FileReader reader = new FileReader(path);
}

Примеры проверяемых исключений

IOException

public String readFile(String filename) throws IOException {
    try (BufferedReader reader = new BufferedReader(
            new FileReader(filename))) {
        return reader.readLine();
    }
}

SQLException

public User getUserById(int id) throws SQLException {
    String sql = "SELECT * FROM users WHERE id = ?";
    try (Connection conn = dataSource.getConnection();
         PreparedStatement stmt = conn.prepareStatement(sql)) {
        stmt.setInt(1, id);
        ResultSet rs = stmt.executeQuery();
        if (rs.next()) {
            return new User(rs.getInt("id"), rs.getString("name"));
        }
    }
    return null;
}

ClassNotFoundException

public Object createInstance(String className) 
        throws ClassNotFoundException, 
               InstantiationException, 
               IllegalAccessException {
    Class<?> clazz = Class.forName(className);
    return clazz.newInstance();
}

Try-with-resources

// Старый способ
FileReader reader = null;
try {
    reader = new FileReader("file.txt");
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (reader != null) {
        try {
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

// Новый способ (Java 7+)
try (FileReader reader = new FileReader("file.txt")) {
    // reader закроется автоматически
} catch (IOException e) {
    e.printStackTrace();
}

Собственные проверяемые исключения

public class InvalidUserException extends Exception {
    public InvalidUserException(String message) {
        super(message);
    }
}

public User createUser(String email) throws InvalidUserException {
    if (email == null || email.isEmpty()) {
        throw new InvalidUserException("Email empty");
    }
    return new User(email);
}

public void handle() {
    try {
        createUser("");
    } catch (InvalidUserException e) {
        System.err.println("Invalid: " + e.getMessage());
    }
}

Exception Chaining

public void processDB() throws DatabaseException {
    try {
        getUserFromDB();
    } catch (SQLException e) {
        throw new DatabaseException("DB failed", e);
    }
}

public void handle() {
    try {
        processDB();
    } catch (DatabaseException e) {
        Throwable cause = e.getCause();
        System.err.println("Original: " + cause.getMessage());
    }
}

Проблемы и решения

// ПЛОХО — игнорирование
try {
    doSomething();
} catch (IOException e) {
    // empty catch
}

// ХОРОШО — логирование
try {
    doSomething();
} catch (IOException e) {
    logger.error("Operation failed", e);
    throw new RuntimeException("Wrapped", e);
}

// ПЛОХО — слишком общие
try {
    doSomething();
} catch (Exception e) {
    System.out.println("Error");
}

// ХОРОШО — конкретные типы
try {
    doSomething();
} catch (FileNotFoundException e) {
    System.out.println("File not found");
} catch (IOException e) {
    System.out.println("IO error");
}

Лучшие практики

✓ Обрабатывай конкретные типы исключений ✓ Используй try-with-resources для ресурсов ✓ Сохраняй оригинальное исключение при оборачивании ✓ Логируй исключения с полным контекстом ✓ Не оставляй пустые catch блоки

✗ Не ловись на Exception ✗ Не игнорируй исключения ✗ Не теряй оригинальное исключение ✗ Не разбрасывай throws везде

Заключение

Проверяемые исключения заставляют разработчика явно обработать исключительные ситуации, что улучшает надёжность кода. Правильное использование try-catch, try-with-resources и exception chaining критично для надёжного Java-кода.