Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Иерархия Exception в Java
В Java существует чёткая иерархия классов исключений. Все исключения наследуются от класса Throwable, который разделяется на две основных ветки: Exception и Error. Понимание этой иерархии критично для правильной обработки ошибок.
Основная структура
Throwable является базовым классом для всех ошибок и исключений. Он разделяется на:
- Exception - исключения, которые может обработать приложение
- Error - ошибки JVM, которые обычно не обрабатываются
Exception, в свою очередь, разделяется на:
- Checked Exceptions (проверяемые)
- Unchecked Exceptions (непроверяемые, наследуются от RuntimeException)
Checked Exceptions (Проверяемые исключения)
Эти исключения должны быть либо обработаны (try-catch), либо объявлены в сигнатуре метода (throws). Компилятор проверяет их наличие.
public void readFile(String fileName) throws IOException {
FileReader reader = new FileReader(fileName);
BufferedReader bufferedReader = new BufferedReader(reader);
String line = bufferedReader.readLine();
bufferedReader.close();
}
public void readFileWithHandling(String fileName) {
try {
FileReader reader = new FileReader(fileName);
BufferedReader br = new BufferedReader(reader);
String line = br.readLine();
br.close();
} catch (IOException e) {
System.err.println("Error reading file: " + e.getMessage());
}
}
public List<User> getUsers() throws SQLException {
Connection conn = DriverManager.getConnection(dbUrl);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
return users;
}
public void loadClass(String className) throws ClassNotFoundException {
Class<?> clazz = Class.forName(className);
System.out.println("Class loaded: " + clazz.getName());
}
Unchecked Exceptions (Непроверяемые исключения)
Наследуются от RuntimeException. Компилятор не требует их явной обработки, но это не означает, что их можно игнорировать.
String str = null;
int length = str.length(); // NullPointerException
int[] arr = {1, 2, 3};
int value = arr[10]; // ArrayIndexOutOfBoundsException
int result = 10 / 0; // ArithmeticException
Object obj = "string";
Integer num = (Integer) obj; // ClassCastException
public void setAge(int age) {
if (age < 0 || age > 150) {
throw new IllegalArgumentException("Age must be between 0 and 150");
}
this.age = age;
}
int num = Integer.parseInt("abc"); // NumberFormatException
Error (Ошибки JVM)
Ошибки, вызванные проблемами в виртуальной машине Java. Их обычно не рекомендуется ловить, так как приложение не может корректно восстановиться.
List<byte[]> list = new ArrayList<>();
while (true) {
list.add(new byte[1024 * 1024]); // OutOfMemoryError
}
public void recursion() {
recursion(); // StackOverflowError
}
Практический пример обработки
public class ExceptionHandlingExample {
public static void main(String[] args) {
try {
processData("input.txt");
} catch (IOException e) {
System.err.println("IO Error: " + e.getMessage());
e.printStackTrace();
} catch (NullPointerException e) {
System.err.println("Null pointer: " + e.getMessage());
} catch (Exception e) {
System.err.println("Unexpected error: " + e.getMessage());
} finally {
System.out.println("Cleanup resources");
}
}
public static void processData(String filename) throws IOException {
if (filename == null) {
throw new IllegalArgumentException("Filename cannot be null");
}
}
}
Создание собственного исключения
public class DatabaseException extends Exception {
public DatabaseException(String message) {
super(message);
}
public DatabaseException(String message, Throwable cause) {
super(message, cause);
}
}
public class ValidationException extends RuntimeException {
public ValidationException(String message) {
super(message);
}
}
public void validateUser(User user) throws ValidationException {
if (user.getEmail() == null || user.getEmail().isEmpty()) {
throw new ValidationException("Email is required");
}
}
Try-with-resources
Для автоматического закрытия ресурсов используйте try-with-resources:
try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
Рекомендации
- Ловить конкретные исключения, не использовать общий catch всегда
- Никогда не игнорировать исключения: всегда логировать или обрабатывать
- Не ловить Error - это признак серьезных проблем
- Создавать собственные исключения для специфичных ошибок
- Использовать finally или try-with-resources для очистки ресурсов
Понимание иерархии Exception критично для написания надежного и правильно структурированного кода.