Exception
Основные определения:
- Exception(Исключение) - это нештатная ситуация, ошибка во время выполнения программы.
- Error - не обрабатываемые исключения тк после из возникновений нет гарантий что программа будет
выполняться корректно. Связанная с работой JVM.
Иерархия исключений:
Типы проверки компилятором:
Checked - компилятор их проверяет.
Checked - ошибки ожидаемые в работающей программе и на их появление будет реакция.
- ClassNotFoundException - класс не найден.
- CloneNotSupportedException - попытка клонировать объект который не реализует Cloneable интерфейс.
- IllegalAccessException - запрещен доступ к классу.
- InstantiationException - попытка создания объект абстрактного класса.
- InterruptedException - один поток был прерван другим потоком.
- NoSuchFieldException - Запрошенное поле не существует.
- NoSuchMethodException - Запрошенное поле не существует.
Unchecked - компилятор их не проверяет.
Error
Error - это ошибки JVM. После их появления нормальная работа не гарантируется.
-
VirtualMachineError
- UnknownError - неизвестная ошибка от JVM.
- InternalError - неизвестная внутренняя ошибка от JVM.
- OutOfMemoryError - недостаток Heap памяти.
- StackOverflowError - недостаток Stack памяти.
- ThreadDeath - создается потоком жертвой при вызове метода Thread.stop().
Runtime Exceptions
Runtime Exceptions - ошибки которые должны быть предотвращены кодом. В рабочем приложении их быть не должно.
При использовании из или их наследников Idea не будет рекомендовать обработку из(красными рекомендациями).
- ArithmeticException - арифметическая ошибка: деление на ноль и тд.
-
IndexOutOfBoundsException
- IndexOutOfBoundsException - некоторый тип индекса находится вне границ.
- ArrayIndexOutOfBoundsException - индекс массива находится вне границ.
- StringIndexOutOfBoundsException - попытка индексации вне границ строки.
- ArrayStoreException - назначение элементу массива несовместимого типа.
- ClassCastException - недопустимое приведение типов.
- ConcurrentModificationException - некорректная модификация коллекции.
-
IllegalArgumentException
- IllegalArgumentException - при вызове метода использован незаконный аргумент.
- IllegalThreadStateException - требуемая операция не совместима с текущим состоянием потока.
- NumberFormatException - недопустимое преобразование строки в числовой формат.
- IllegalMonitorStateException - незаконная операция монитора на разблокированном экземпляре.
- IllegalStateException - среда или приложение находятся в некорректном состоянии.
- NegativeArraySizeException - массив создавался с отрицательным размером.
- NullPointerException - недопустимое использование нулевой ссылки.
- UnsupportedOperationException - встретилась неподдерживаемая операция.
Способы обработки исключений
Throws
throws - ключевое слово которое, используется при определении метода. Указывает что метод может выкинуть
ошибку.
Если переопределять метод с keyword 'throws'. Наследник должен отлавливать 'throws' не выше по иерархии чем у
родителя.
try - catch - finally
Если используются несколько catch нужно писать их отлавливаемые исключения в порядке возвышения по
иерархии.
Можно написать try - finally без блока catch. Но try не может быть без finally и catch.
try(try-with-resources){}
catch(Exception e) {}
catch(ClassCastException | ArrayStoreException e1) {}
finally {}
try-with-resources(since v.9) - дает возможность объявлять один или несколько ресурсов в блоке try,
которые будут закрыты автоматически без использования finally блока. Проверяет наличие интерфейса
AutoCloseable или Closeable. И выполняет метод close. Может быть без finally и catch.
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
return br.readLine();
}
Создание кастомных Exception классов
- Не создавать и использовать класс исключение, если он уже существует.
- Наследоваться от класса Exception - так как логически бизнес логика не зависит от существующих классов
исключений. И - это конвенция!
- Использовать окончание Exception в имени класса.
Пример:
public class CustomException extends Exception {
public CustomException(String message) {
super(message);
}
}
Условия не выполнения finally:
- System.exit(int)
- Сбой в JVM
- Exception в finally
- Death of Daemon thread