Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Проверяемые исключения (Checked Exceptions)
Проверяемое исключение — это исключение, которое компилятор Java требует явно обработать или объявить в сигнатуре метода. Это часть контракта метода.
Иерархия исключений
Throwable ├── Exception (проверяемые) │ ├── IOException │ ├── SQLException │ ├── ClassNotFoundException │ └── FileNotFoundException └── RuntimeException (непроверяемые)
├── NullPointerException
└── ArrayIndexOutOfBoundsException
Проверяемые vs Непроверяемые
// ПРОВЕРЯЕМОЕ — IOException
public String readFile(String path) throws IOException {
FileReader reader = new FileReader(path);
return reader.read() + "";
}
// НЕПРОВЕРЯЕМОЕ — NullPointerException
public int divide(int a, int b) {
return a / b; // Не нужно throws
}
Обязательная обработка
// Вариант 1: Try-catch
public void process(String path) {
try {
FileReader reader = new FileReader(path);
} catch (FileNotFoundException e) {
System.out.println("File not found");
}
}
// Вариант 2: Объявление throws
public void process(String path) throws IOException {
FileReader reader = new FileReader(path);
}
Примеры проверяемых исключений
IOException
public String readFile(String filename) throws IOException {
try (BufferedReader reader = new BufferedReader(
new FileReader(filename))) {
return reader.readLine();
}
}
SQLException
public User getUserById(int id) throws SQLException {
String sql = "SELECT * FROM users WHERE id = ?";
try (Connection conn = dataSource.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setInt(1, id);
ResultSet rs = stmt.executeQuery();
if (rs.next()) {
return new User(rs.getInt("id"), rs.getString("name"));
}
}
return null;
}
ClassNotFoundException
public Object createInstance(String className)
throws ClassNotFoundException,
InstantiationException,
IllegalAccessException {
Class<?> clazz = Class.forName(className);
return clazz.newInstance();
}
Try-with-resources
// Старый способ
FileReader reader = null;
try {
reader = new FileReader("file.txt");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// Новый способ (Java 7+)
try (FileReader reader = new FileReader("file.txt")) {
// reader закроется автоматически
} catch (IOException e) {
e.printStackTrace();
}
Собственные проверяемые исключения
public class InvalidUserException extends Exception {
public InvalidUserException(String message) {
super(message);
}
}
public User createUser(String email) throws InvalidUserException {
if (email == null || email.isEmpty()) {
throw new InvalidUserException("Email empty");
}
return new User(email);
}
public void handle() {
try {
createUser("");
} catch (InvalidUserException e) {
System.err.println("Invalid: " + e.getMessage());
}
}
Exception Chaining
public void processDB() throws DatabaseException {
try {
getUserFromDB();
} catch (SQLException e) {
throw new DatabaseException("DB failed", e);
}
}
public void handle() {
try {
processDB();
} catch (DatabaseException e) {
Throwable cause = e.getCause();
System.err.println("Original: " + cause.getMessage());
}
}
Проблемы и решения
// ПЛОХО — игнорирование
try {
doSomething();
} catch (IOException e) {
// empty catch
}
// ХОРОШО — логирование
try {
doSomething();
} catch (IOException e) {
logger.error("Operation failed", e);
throw new RuntimeException("Wrapped", e);
}
// ПЛОХО — слишком общие
try {
doSomething();
} catch (Exception e) {
System.out.println("Error");
}
// ХОРОШО — конкретные типы
try {
doSomething();
} catch (FileNotFoundException e) {
System.out.println("File not found");
} catch (IOException e) {
System.out.println("IO error");
}
Лучшие практики
✓ Обрабатывай конкретные типы исключений ✓ Используй try-with-resources для ресурсов ✓ Сохраняй оригинальное исключение при оборачивании ✓ Логируй исключения с полным контекстом ✓ Не оставляй пустые catch блоки
✗ Не ловись на Exception ✗ Не игнорируй исключения ✗ Не теряй оригинальное исключение ✗ Не разбрасывай throws везде
Заключение
Проверяемые исключения заставляют разработчика явно обработать исключительные ситуации, что улучшает надёжность кода. Правильное использование try-catch, try-with-resources и exception chaining критично для надёжного Java-кода.