← Назад к вопросам

Какие исключения можно обработать в блоке catch

2.0 Middle🔥 181 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Исключения в блоке 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 для специфичных ситуаций

Какие исключения можно обработать в блоке catch | PrepBro