Какое исключение нужно написать после throws, чтобы вызывающий метод его обязательно обработал?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Проверяемые исключения (Checked Exceptions)
Что такое проверяемые исключения?
Чтобы вызывающий метод был обязан обработать исключение, нужно указать после ключевого слова throws проверяемое исключение (Checked Exception). Проверяемые исключения — это исключения, наследующиеся от класса java.lang.Exception, но не от java.lang.RuntimeException. Компилятор Java проверяет (hence the name) наличие обработки этих исключений.
Иерархия исключений
В Java существует две основные категории исключений:
- Checked Exceptions: Наследуют
Exception(но неRuntimeException). Обязательна обработка через try-catch или throw - Unchecked Exceptions (Runtime Exceptions): Наследуют
RuntimeException. Обработка опциональна
Примеры проверяемых исключений
Стандартные проверяемые исключения из Java:
// IOException — самое частое проверяемое исключение
public void readFile(String filename) throws IOException {
FileInputStream fis = new FileInputStream(filename);
// Код для чтения файла
}
// SQLException — исключение при работе с БД
public void queryDatabase() throws SQLException {
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/db");
// Код запроса
}
// ClassNotFoundException — когда класс не найден
public void loadClass() throws ClassNotFoundException {
Class.forName("com.example.MyClass");
}
// InterruptedException — при прерывании потока
public void sleepThread() throws InterruptedException {
Thread.sleep(1000);
}
Обязательная обработка
Вызывающий метод должен либо перехватить исключение, либо переклассифицировать его:
// Вариант 1: Перехват исключения (try-catch)
public void caller() {
try {
readFile("data.txt");
} catch (IOException e) {
System.out.println("Ошибка при чтении файла: " + e.getMessage());
}
}
// Вариант 2: Переклассификация (throws)
public void caller() throws IOException {
readFile("data.txt");
}
Множественные исключения
Метод может выбросить несколько разных проверяемых исключений:
public void complexOperation() throws IOException, SQLException, ClassNotFoundException {
readFile("data.txt");
queryDatabase();
loadClass();
}
// Или более лаконично — общее суперклассное исключение:
public void complexOperation() throws Exception {
readFile("data.txt");
queryDatabase();
loadClass();
}
Отличие от unchecked исключений
Для unchecked исключений (RuntimeException) обработка не требуется:
// Не требуется throws для unchecked исключений
public void divide(int a, int b) {
// ArithmeticException — это RuntimeException, можно не указывать в throws
System.out.println(a / b);
}
// Даже если указать — это просто информативно, не обязательно
public void divide(int a, int b) throws ArithmeticException {
System.out.println(a / b);
}
Практические рекомендации
- Используй проверяемые исключения для ожидаемых ошибок, которые вызывающий код должен обработать (I/O ошибки, сетевые проблемы)
- Используй unchecked исключения для программных ошибок, которые указывают на баги (NullPointerException, IndexOutOfBoundsException)
- Не игнорируй проверяемые исключения — если метод объявляет throws, обязательно обработай их
- Создавай собственные checked исключения для специфичных ошибок бизнес-логики
Собственное проверяемое исключение
public class InvalidAgeException extends Exception {
public InvalidAgeException(String message) {
super(message);
}
}
public void setAge(int age) throws InvalidAgeException {
if (age < 0 || age > 150) {
throw new InvalidAgeException("Возраст должен быть от 0 до 150");
}
}
Итак, ответ: нужно указать проверяемое исключение (Checked Exception), которое наследует Exception, но не RuntimeException. Компилятор обязательно проверит, что вызывающий код его обработал.