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

Является ли Throwable неконтролируемым исключением?

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

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

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

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

Является ли Throwable неконтролируемым исключением?

Ответ: Нет, Throwable — это СУПЕР-класс для всех исключений, который НЕ является ни контролируемым, ни неконтролируемым исключением.

Это важное уточнение, потому что часто на интервью задают подобные вопросы с подвохом.

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

                        Throwable
                       /         \
                    Error      Exception
                    /             /       \
        (VirtualMachineError)  Checked  Unchecked
      (OutOfMemoryError и т.д) /          \
                      (IOException,   (NullPointerException,
                       SQLException)  RuntimeException)

Три категории

1. Checked (Контролируемые) исключения

Наследуют Exception, но НЕ наследуют RuntimeException. Компилятор ТРЕБУЕТ их обработать или объявить.

public class CheckedException {
    // IOException — контролируемое исключение
    public void readFile(String path) throws IOException {
        FileInputStream fis = new FileInputStream(path);
        // Файл не существует — компилятор требует обработать IOException
    }
    
    // Обработка try-catch
    public void readFileWithTryCatch(String path) {
        try {
            FileInputStream fis = new FileInputStream(path);
        } catch (IOException e) {
            System.out.println("Файл не найден: " + e.getMessage());
        }
    }
}

Примеры контролируемых исключений:

  • IOException — проблемы с вводом-выводом
  • SQLException — проблемы с базой данных
  • ClassNotFoundException — класс не найден
  • InterruptedException — прерывание потока

2. Unchecked (Неконтролируемые) исключения

Наследуют RuntimeException. Компилятор НЕ требует их обработки.

public class UncheckedException {
    // NullPointerException — неконтролируемое исключение
    public void processList(List<String> items) {
        for (String item : items) {
            System.out.println(item.toUpperCase());
            // Если item == null, будет NullPointerException
            // Компилятор не потребует обработку
        }
    }
    
    // ArithmeticException — неконтролируемое исключение
    public int divide(int a, int b) {
        return a / b; // Если b == 0 — ArithmeticException
    }
}

Примеры неконтролируемых исключений:

  • NullPointerException — попытка вызова метода на null
  • ArrayIndexOutOfBoundsException — выход за границы массива
  • ClassCastException — неверный тип при приведении
  • ArithmeticException — деление на ноль
  • IllegalArgumentException — неверный аргумент

3. Errors (Ошибки)

Наследуют Error, а не Exception. Это ОЧЕНЬ серьёзные проблемы, на которые обычно нельзя повлиять на уровне приложения.

public class ErrorExample {
    // StackOverflowError — переполнение стека
    public void infiniteRecursion() {
        infiniteRecursion(); // Не обрабатывается и не должно быть!
    }
    
    // OutOfMemoryError — недостаточно памяти
    public void allocateHugeArray() {
        int[] huge = new int[Integer.MAX_VALUE];
    }
}

Примеры Errors:

  • OutOfMemoryError — недостаточно памяти
  • StackOverflowError — переполнение стека вызовов
  • VirtualMachineError — критическая ошибка JVM
  • LinkageError — ошибка связывания классов

Иерархия подробнее

// Throwable — супер-класс для ВСЕГО
public class Throwable implements Serializable {
    // ...
}

// Exception наследует Throwable
public class Exception extends Throwable {
    // ...
}

// Checked исключение
public class IOException extends Exception {
    // ...
}

// RuntimeException наследует Exception
public class RuntimeException extends Exception {
    // ...
}

// Unchecked исключение
public class NullPointerException extends RuntimeException {
    // ...
}

// Error наследует Throwable
public class Error extends Throwable {
    // ...
}

// Ошибка (очень серьёзная)
public class OutOfMemoryError extends Error {
    // ...
}

Практический пример

import java.io.IOException;
import java.io.FileInputStream;

public class ExceptionHierarchyExample {
    // Метод с контролируемым исключением
    public void methodWithCheckedException() throws IOException {
        new FileInputStream("/path/to/file");
    }
    
    // Метод с неконтролируемым исключением
    public void methodWithUncheckedException() {
        String str = null;
        str.length(); // NullPointerException — не требуется объявлять
    }
    
    public static void main(String[] args) {
        ExceptionHierarchyExample example = new ExceptionHierarchyExample();
        
        // Контролируемое — ОБЯЗАТЕЛЬНО обработать
        try {
            example.methodWithCheckedException();
        } catch (IOException e) {
            System.out.println("Ошибка ввода-вывода: " + e.getMessage());
        }
        
        // Неконтролируемое — можно НЕ обрабатывать
        example.methodWithUncheckedException();
        // Если не обработано — программа упадёт
    }
}

Таблица сравнения

ПараметрCheckedUncheckedError
СуперклассException (не RuntimeException)RuntimeExceptionError
ОбработкаОбязательна (throws или try-catch)ОпциональнаОбычно не обрабатывается
ПричинаОжидаемые ошибки (файл не найден)Логические ошибки (null, индекс)Критические сбои JVM
ПримерыIOException, SQLExceptionNullPointerException, ArrayIndexOutOfBoundsExceptionOutOfMemoryError, StackOverflowError

Распространённая ошибка

// НЕПРАВИЛЬНО: ловить Throwable
try {
    // код
} catch (Throwable t) {
    // Никогда так не делайте! Ловите Exception или конкретный класс
}

// ПРАВИЛЬНО: ловить Exception
try {
    // код
} catch (Exception e) {
    // Хорошо
} catch (Error error) {
    // Отдельная обработка критических ошибок (если необходимо)
}

// ЕЩЁ ЛУЧШЕ: ловить конкретное исключение
try {
    new FileInputStream("/path");
} catch (IOException e) {
    System.out.println("Файл не найден");
}

Проверка типа исключения

public class ExceptionTypeChecker {
    public static void checkExceptionType(Exception e) {
        if (e instanceof IOException) {
            System.out.println("Это контролируемое исключение (IOException)");
        } else if (e instanceof NullPointerException) {
            System.out.println("Это неконтролируемое исключение (NPE)");
        } else if (e instanceof RuntimeException) {
            System.out.println("Это какое-то неконтролируемое исключение");
        }
    }
    
    public static void main(String[] args) {
        checkExceptionType(new IOException());
        checkExceptionType(new NullPointerException());
    }
}

Вывод

Throwable НЕ является ни контролируемым, ни неконтролируемым исключением. Это просто супер-класс, который:

  • Родитель для Exception (контролируемых и неконтролируемых)
  • Родитель для Error (критические ошибки)

Правильно классифицировать:

  • CheckedException (кроме RuntimeException)
  • UncheckedRuntimeException
  • ErrorsError (не исключения, а критические ошибки)

По этой классификации разработчик определяет стратегию обработки исключений в приложении.

Является ли Throwable неконтролируемым исключением? | PrepBro