Какие исключения можно обработать в блоке catch
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Исключения в блоке catch
Краткий ответ: В блоке catch можно обработать любой класс, который является подклассом Throwable. На практике чаще всего обрабатывают классы, наследующие Exception или RuntimeException.
Иерархия исключений в Java
Throwable
├── Error (не рекомендуется ловить)
│ ├── OutOfMemoryError
│ ├── StackOverflowError
│ ├── VirtualMachineError
│ └── ...
├── Exception (обработанные исключения)
│ ├── IOException
│ ├── SQLException
│ ├── ClassNotFoundException
│ ├── RuntimeException (необработанные исключения)
│ │ ├── NullPointerException
│ │ ├── ArrayIndexOutOfBoundsException
│ │ ├── ArithmeticException
│ │ ├── ClassCastException
│ │ └── ...
│ └── ...
└── Throwable (теоретически всё, но избегай)
Что можно ловить в catch
1. Checked exceptions (проверяемые исключения):
Обязательны к обработке при компиляции:
public class CheckedExceptionsExample {
public static void main(String[] args) {
try {
// IOException — проверяемое исключение
FileInputStream fis = new FileInputStream("file.txt");
// SQLException — проверяемое исключение
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/db");
} catch (IOException e) {
// Обрабатываем IOException
System.err.println("Файл не найден: " + e.getMessage());
} catch (SQLException e) {
// Обрабатываем SQLException
System.err.println("Ошибка БД: " + e.getMessage());
}
}
}
2. Unchecked exceptions (необработанные исключения):
Не обязательны к обработке, но можно:
public class UncheckedExceptionsExample {
public static void main(String[] args) {
try {
int[] arr = {1, 2, 3};
int value = arr[10]; // ArrayIndexOutOfBoundsException
String str = null;
System.out.println(str.length()); // NullPointerException
int result = 10 / 0; // ArithmeticException
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println("Индекс выходит за границы массива");
} catch (NullPointerException e) {
System.err.println("Попытка вызова метода на null");
} catch (ArithmeticException e) {
System.err.println("Ошибка в арифметике");
}
}
}
Ловля множественных исключений
1. Multi-catch (Java 7+):
public class MultiCatchExample {
public static void main(String[] args) {
try {
readFile("data.txt");
} catch (IOException | ClassNotFoundException e) {
// Обрабатываем либо IOException, либо ClassNotFoundException
System.err.println("Ошибка при чтении/обработке файла: " + e.getMessage());
}
}
static void readFile(String filename) throws IOException, ClassNotFoundException {
FileInputStream fis = new FileInputStream(filename);
ObjectInputStream ois = new ObjectInputStream(fis);
}
}
2. Иерархическая ловля (от более специфичного к общему):
public class HierarchicalCatchExample {
public static void main(String[] args) {
try {
performDatabaseOperation();
} catch (SQLException e) {
// Самое специфичное — обрабатываем сначала
System.err.println("Ошибка БД: " + e.getMessage());
} catch (IOException e) {
// Более общее
System.err.println("Ошибка ввода-вывода: " + e.getMessage());
} catch (Exception e) {
// Самое общее
System.err.println("Неизвестная ошибка: " + e.getMessage());
}
}
}
Важно: Порядок имеет значение! Catch блоки проверяются в порядке появления. Если вверху общий Exception, то catch для SQLException никогда не сработает.
Примеры обработки конкретных исключений
public class ExceptionHandlingPractice {
// 1. IOException — файловые операции
public String readFile(String filename) {
try {
Files.readAllLines(Paths.get(filename));
} catch (IOException e) {
System.err.println("Не удалось прочитать файл: " + e.getMessage());
return null;
}
}
// 2. SQLException — работа с БД
public void queryDatabase() {
try {
Connection conn = getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
} catch (SQLException e) {
System.err.println("Ошибка SQL: " + e.getMessage());
}
}
// 3. NumberFormatException — парсинг
public int parseNumber(String str) {
try {
return Integer.parseInt(str);
} catch (NumberFormatException e) {
System.err.println("Невалидный номер: " + str);
return -1;
}
}
// 4. ClassNotFoundException — рефлексия
public void loadClass(String className) {
try {
Class.forName(className);
} catch (ClassNotFoundException e) {
System.err.println("Класс не найден: " + className);
}
}
// 5. ArrayIndexOutOfBoundsException
public void accessArray(int[] arr, int index) {
try {
System.out.println(arr[index]);
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println("Индекс выходит за границы: " + index);
}
}
// 6. NullPointerException
public int getStringLength(String str) {
try {
return str.length();
} catch (NullPointerException e) {
System.err.println("Строка равна null");
return 0;
}
}
}
Что НЕЛЬЗЯ ловить
// ПЛОХО: не лови Throwable
try {
// код
} catch (Throwable t) {
// Поймаешь даже ошибки VM, которые нельзя обработать
}
// ПЛОХО: не лови Error
try {
// код
} catch (Error e) {
// Поймаешь OutOfMemoryError, StackOverflowError и т.д.
}
// ПЛОХО: пустой catch
try {
// код
} catch (Exception e) {
// Ничего не делаем — скрываем ошибку!
}
// ХОРОШО: логируй и пробрасывай
try {
// код
} catch (SQLException e) {
log.error("Database error", e);
throw new RuntimeException("Database operation failed", e);
}
Try-with-resources (автоматическое закрытие ресурсов)
public class TryWithResourcesExample {
public void readFileWithAutoClose(String filename) {
try (FileInputStream fis = new FileInputStream(filename);
BufferedInputStream bis = new BufferedInputStream(fis)) {
// Код
int data = bis.read();
} catch (IOException e) {
// При выходе из try-блока ресурсы закроются автоматически
System.err.println("Ошибка: " + e.getMessage());
}
}
}
Best Practices
✓ Лови только те исключения, которые можешь обработать ✓ Лови более специфичные исключения перед общими ✓ Логируй исключения перед обработкой ✓ Не используй пустые catch блоки ✓ Используй try-with-resources для автоматического закрытия ресурсов ✓ Пробрасывай исключение выше, если не можешь обработать ✓ Не лови Error или Throwable (исключение: фреймворки типа Spring) ✓ Используй Custom Exceptions для специфичных ситуаций