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

Какая иерархия Exception?

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

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

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

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

Иерархия Exception в Java

В Java существует чёткая иерархия классов исключений. Все исключения наследуются от класса Throwable, который разделяется на две основных ветки: Exception и Error. Понимание этой иерархии критично для правильной обработки ошибок.

Основная структура

Throwable является базовым классом для всех ошибок и исключений. Он разделяется на:

  1. Exception - исключения, которые может обработать приложение
  2. Error - ошибки JVM, которые обычно не обрабатываются

Exception, в свою очередь, разделяется на:

  • Checked Exceptions (проверяемые)
  • Unchecked Exceptions (непроверяемые, наследуются от RuntimeException)

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

Эти исключения должны быть либо обработаны (try-catch), либо объявлены в сигнатуре метода (throws). Компилятор проверяет их наличие.

public void readFile(String fileName) throws IOException {
    FileReader reader = new FileReader(fileName);
    BufferedReader bufferedReader = new BufferedReader(reader);
    String line = bufferedReader.readLine();
    bufferedReader.close();
}

public void readFileWithHandling(String fileName) {
    try {
        FileReader reader = new FileReader(fileName);
        BufferedReader br = new BufferedReader(reader);
        String line = br.readLine();
        br.close();
    } catch (IOException e) {
        System.err.println("Error reading file: " + e.getMessage());
    }
}

public List<User> getUsers() throws SQLException {
    Connection conn = DriverManager.getConnection(dbUrl);
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery("SELECT * FROM users");
    return users;
}

public void loadClass(String className) throws ClassNotFoundException {
    Class<?> clazz = Class.forName(className);
    System.out.println("Class loaded: " + clazz.getName());
}

Unchecked Exceptions (Непроверяемые исключения)

Наследуются от RuntimeException. Компилятор не требует их явной обработки, но это не означает, что их можно игнорировать.

String str = null;
int length = str.length(); // NullPointerException

int[] arr = {1, 2, 3};
int value = arr[10]; // ArrayIndexOutOfBoundsException

int result = 10 / 0; // ArithmeticException

Object obj = "string";
Integer num = (Integer) obj; // ClassCastException

public void setAge(int age) {
    if (age < 0 || age > 150) {
        throw new IllegalArgumentException("Age must be between 0 and 150");
    }
    this.age = age;
}

int num = Integer.parseInt("abc"); // NumberFormatException

Error (Ошибки JVM)

Ошибки, вызванные проблемами в виртуальной машине Java. Их обычно не рекомендуется ловить, так как приложение не может корректно восстановиться.

List<byte[]> list = new ArrayList<>();
while (true) {
    list.add(new byte[1024 * 1024]); // OutOfMemoryError
}

public void recursion() {
    recursion(); // StackOverflowError
}

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

public class ExceptionHandlingExample {
    
    public static void main(String[] args) {
        try {
            processData("input.txt");
        } catch (IOException e) {
            System.err.println("IO Error: " + e.getMessage());
            e.printStackTrace();
        } catch (NullPointerException e) {
            System.err.println("Null pointer: " + e.getMessage());
        } catch (Exception e) {
            System.err.println("Unexpected error: " + e.getMessage());
        } finally {
            System.out.println("Cleanup resources");
        }
    }
    
    public static void processData(String filename) throws IOException {
        if (filename == null) {
            throw new IllegalArgumentException("Filename cannot be null");
        }
    }
}

Создание собственного исключения

public class DatabaseException extends Exception {
    public DatabaseException(String message) {
        super(message);
    }
    
    public DatabaseException(String message, Throwable cause) {
        super(message, cause);
    }
}

public class ValidationException extends RuntimeException {
    public ValidationException(String message) {
        super(message);
    }
}

public void validateUser(User user) throws ValidationException {
    if (user.getEmail() == null || user.getEmail().isEmpty()) {
        throw new ValidationException("Email is required");
    }
}

Try-with-resources

Для автоматического закрытия ресурсов используйте try-with-resources:

try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}

Рекомендации

  1. Ловить конкретные исключения, не использовать общий catch всегда
  2. Никогда не игнорировать исключения: всегда логировать или обрабатывать
  3. Не ловить Error - это признак серьезных проблем
  4. Создавать собственные исключения для специфичных ошибок
  5. Использовать finally или try-with-resources для очистки ресурсов

Понимание иерархии Exception критично для написания надежного и правильно структурированного кода.

Какая иерархия Exception? | PrepBro