Что выдаст ошибку, если не обработать проверяемое исключение
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что выдаст ошибка, если не обработать проверяемое исключение
В Java существует два типа исключений: проверяемые (checked exceptions) и непроверяемые (unchecked exceptions). Вопрос касается именно проверяемых исключений, которые требуют обязательной обработки на этапе компиляции.
Ошибка компиляции
Если не обработать проверяемое исключение, вы получите ошибку компиляции (compile-time error). Компилятор Java просто не позволит вашему коду скомпилироваться:
// ❌ Это НЕ скомпилируется
public void readFile(String filename) {
FileReader reader = new FileReader(filename); // IOException - проверяемое исключение
// Ошибка компилятора: "unreported exception FileReader"
}
Компилятор выдаст примерно следующую ошибку:
error: unreported exception FileNotFoundException; must be caught or declared to be thrown
FileReader reader = new FileReader(filename);
^
Способы обработки проверяемых исключений
Способ 1: Catch блок
public void readFile(String filename) {
try {
FileReader reader = new FileReader(filename);
// работа с файлом
} catch (FileNotFoundException e) {
// обработка исключения
System.err.println("Файл не найден: " + e.getMessage());
}
}
Способ 2: throws в сигнатуре метода
public void readFile(String filename) throws FileNotFoundException {
FileReader reader = new FileReader(filename);
// работа с файлом
}
Этот подход переносит ответственность на вызывающий код.
Иерархия исключений
Проверяемые исключения наследуются от Exception, но НЕ от RuntimeException:
// Иерархия исключений в Java:
// Throwable
// ├─ Exception (проверяемые)
// │ ├─ IOException
// │ ├─ FileNotFoundException
// │ └─ SQLException
// │
// └─ RuntimeException (непроверяемые)
// ├─ NullPointerException
// ├─ ArrayIndexOutOfBoundsException
// └─ ClassCastException
Примеры проверяемых исключений
// IOException и его подклассы
FileInputStream fis = new FileInputStream("file.txt"); // throws IOException
// SQLException
Connection conn = DriverManager.getConnection(url); // throws SQLException
// ClassNotFoundException
Class.forName("com.mysql.jdbc.Driver"); // throws ClassNotFoundException
// InterruptedException
Thread.sleep(1000); // throws InterruptedException
Try-with-resources для чистого кода
В современной Java (7+) используй try-with-resources для автоматического закрытия ресурсов:
public void readFile(String filename) {
try (FileReader reader = new FileReader(filename)) {
// работа с файлом
int data = reader.read();
} catch (IOException e) {
// обработка
}
// reader автоматически закроется
}
Многоуровневая обработка
public void processData() throws IOException {
try {
readFile("data.txt");
} catch (FileNotFoundException e) {
// более специфичный catch
throw new RuntimeException("Критическая ошибка: файл не найден", e);
} catch (IOException e) {
// более общий catch
System.err.println("Ошибка ввода-вывода: " + e.getMessage());
}
}
Итоговая таблица
| Тип | Требует обработки | Наследник | Примеры |
|---|---|---|---|
| Checked | ✅ Да | Exception | IOException, SQLException |
| Unchecked | ❌ Нет | RuntimeException | NullPointerException, ArithmeticException |
Вывод
Если не обработать проверяемое исключение, компилятор Java выдаст ошибку компиляции и не позволит скомпилировать программу. Это фундаментальная особенность языка, которая принуждает разработчиков явно обрабатывать ошибки, делая код более надежным и предсказуемым.