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

В чем разница между исключениями?

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

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

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

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

Различия между исключениями в Java

В Java существует иерархия исключений, каждый тип которой имеет своё назначение и характеристики. Рассмотрим ключевые различия.

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

Throwable
  ├── Error (критические ошибки VM)
  └── Exception
      ├── Checked Exception (проверяемые)
      │   ├── IOException
      │   ├── SQLException
      │   ├── ClassNotFoundException
      │   └── ...
      └── Unchecked Exception (непроверяемые)
          ├── RuntimeException
          │   ├── NullPointerException
          │   ├── ArithmeticException
          │   ├── IndexOutOfBoundsException
          │   └── ...
          └── Error (редко ловим)
              ├── OutOfMemoryError
              ├── StackOverflowError
              └── ...

Checked vs Unchecked Exceptions

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

Это исключения, которые ОБЯЗАТЕЛЬНО нужно обрабатывать или объявлять в сигнатуре метода.

// ✅ Правильно: либо обрабатываем, либо объявляем throws
public void readFile(String filename) throws IOException {
    FileReader reader = new FileReader(filename);  // Выбросит IOException
    // ...
}

// Или обрабатываем исключение
public void readFile(String filename) {
    try {
        FileReader reader = new FileReader(filename);
        // ...
    } catch (IOException e) {
        System.out.println("Ошибка чтения файла: " + e.getMessage());
    }
}

// ❌ Компилятор не позволит:
public void readFile(String filename) {
    FileReader reader = new FileReader(filename);  // ОШИБКА КОМПИЛЯЦИИ
}

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

Это исключения, которые наследуют от RuntimeException и могут быть выброшены без объявления.

// Допускается без throws или try-catch
public int divide(int a, int b) {
    return a / b;  // Может выбросить ArithmeticException
}

public String getName(List<String> names, int index) {
    return names.get(index);  // Может выбросить IndexOutOfBoundsException
}

// Можем обрабатывать, но не обязаны
public int divide(int a, int b) {
    try {
        return a / b;
    } catch (ArithmeticException e) {
        return 0;
    }
}

Ключевые различия

ХарактеристикаCheckedUnchecked
НаследованиеException (кроме RuntimeException)RuntimeException
Обязательность обработкиОБЯЗАТЕЛЬНООПЦИОНАЛЬНО
Компилятор проверяетДАНЕТ
Объявление в throwsТРЕБУЕТСЯОПЦИОНАЛЬНО
Типичные причиныОжидаемые ошибки ввода-вывода, БДОшибки программирования
ПримерыIOException, SQLExceptionNullPointerException, IndexOutOfBoundsException

Error vs Exception

Error — это критические ошибки JVM, которые приложение НЕ ДОЛЖНО ловить:

// ❌ Очень редко! Обычно не ловим Error
try {
    // Какой-то код
} catch (OutOfMemoryError e) {  // Избегай этого!
    System.out.println("Память закончилась");
}

// ✅ Правильное использование Error
public static void main(String[] args) {
    try {
        // Код приложения
    } catch (Exception e) {  // Ловим Exception, не Error
        logger.error("Ошибка приложения", e);
    }
}

// Типичные Error:
// - OutOfMemoryError: JVM не хватает памяти
// - StackOverflowError: переполнение стека вызовов
// - VirtualMachineError: критическая ошибка JVM

RuntimeException vs другие Exception

RuntimeException — базовый класс для unchecked исключений:

// RuntimeException иерархия
public class NullPointerException extends RuntimeException { }
public class ArithmeticException extends RuntimeException { }
public class IndexOutOfBoundsException extends RuntimeException { }

// Другие Exception
public class IOException extends Exception { }           // Checked
public class SQLException extends Exception { }         // Checked
public class ClassNotFoundException extends Exception { } // Checked

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

public class ExceptionExample {
    // 1. Checked Exception — ОБЯЗАТЕЛЬНО обрабатываем или объявляем
    public void connectToDatabase() throws SQLException {
        Connection conn = DriverManager.getConnection("jdbc:...");
    }
    
    // 2. Unchecked Exception — обработка ОПЦИОНАЛЬНА
    public int parseNumber(String value) {
        return Integer.parseInt(value);  // Может выбросить NumberFormatException
    }
    
    // 3. Правильная обработка Checked Exception
    public String readFile(String path) {
        try {
            BufferedReader reader = new BufferedReader(new FileReader(path));
            return reader.readLine();
        } catch (IOException e) {
            logger.error("Ошибка чтения файла", e);
            throw new RuntimeException("Не удалось прочитать файл", e);
        }
    }
    
    // 4. Проверка перед unchecked exception
    public String getElement(List<String> list, int index) {
        if (index < 0 || index >= list.size()) {
            throw new IllegalArgumentException("Индекс вне границ");
        }
        return list.get(index);
    }
    
    // 5. Multi-catch (Java 7+)
    public void processFile(String filename) {
        try {
            // Код
        } catch (IOException | SQLException e) {
            logger.error("Ошибка обработки", e);
        }
    }
}

Когда использовать какое исключение?

Checked Exception:

  • Ожидаемые внешние ошибки (файловая система, сеть, БД)
  • Ошибки, которые вызывающий код должен обработать

Unchecked Exception:

  • Ошибки программирования (null check, array bounds, type conversion)
  • Ошибки, которые указывают на баг в коде

Error:

  • Не ловим, не восстанавливаемся
  • Это проблемы JVM, не приложения

Best Practice

// ✅ Хорошо: преобразуем Checked в Unchecked для удобства
public class FileService {
    public String readFile(String path) {
        try {
            return new String(Files.readAllBytes(Paths.get(path)));
        } catch (IOException e) {
            throw new UncheckedIOException(e);  // Wrapping
        }
    }
}

// ❌ Плохо: тихо игнорируем исключения
public void processFile() {
    try {
        readFile("path");
    } catch (Exception e) {
        // Молчим, игнорируем ошибку
    }
}
В чем разница между исключениями? | PrepBro