Комментарии (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;
}
}
Ключевые различия
| Характеристика | Checked | Unchecked |
|---|---|---|
| Наследование | Exception (кроме RuntimeException) | RuntimeException |
| Обязательность обработки | ОБЯЗАТЕЛЬНО | ОПЦИОНАЛЬНО |
| Компилятор проверяет | ДА | НЕТ |
| Объявление в throws | ТРЕБУЕТСЯ | ОПЦИОНАЛЬНО |
| Типичные причины | Ожидаемые ошибки ввода-вывода, БД | Ошибки программирования |
| Примеры | IOException, SQLException | NullPointerException, 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) {
// Молчим, игнорируем ошибку
}
}