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

От чего наследуется Exception?

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

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

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

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

Иерархия классов 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 — невосстанавливаемые критические ошибки
  • Правильное использование иерархии исключений — ключ к надёжному коду