ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 22.11.2023
Просмотров: 24
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
-
Что такое исключение? Для чего они нужны?
Событие, которое возникает во время выполнения программы и прерывает нормальный поток выполнения инструкций. Причины возникновения - Пользователь ввел недопустимые данные / Файл не найден / Потеряно соединение.
Исключения используются для обработки ошибок и других особых ситуаций.
Нужны для продолжения выполнения программы, при возникновении ошибок программирования, неправильного использования API или непредусмотренного поведения пользователя.
-
Расскажи про иерархию исключений?
Класс исключений является подклассом класса Throwable
Помимо класса исключений существует подкласс ошибок (Error), В большинстве случаев Error не нужно обрабатывать (StackOverflowError / OutOfMemoryError)
Все классы исключений представляют подтипы класса java.lang.Exception
Класс исключений делится на два подкласса unchecked и checked:
RuntimeException (unchecked) – исключения на этапе выполнения
IOException (checked) – другие исключения
-
В чём разница между проверяемыми исключениями и непроверяемыми? В чём разница с точки зрения синтаксиса и идеологическая при использовании?
Checked (проверяемые исключение) мы должны или обработать с помощью try/catch или пробросить дальше добавлением в сигнатуру throws. Непроверямые ни обрабатывать ни делать что-либо ещё не нужно.
Unchecked исключения это не ошибки JVM, но RunTimeException это больше ошибка кода (программиста), которую нужно исправить.
Встроенные исключения:
Unchecked RuntimeException
ArrayIndexOutOfBoundsException - Индекс массива выходит за пределы
ClassCastException - Недопустимое приведение типов
IllegalArgumentException - Недопустимый аргумент, используемый для вызова метода
NullPointerException - Недопустимое использование нулевой ссылки
NumberFormatException - Неверное преобразование строки в числовой формат
Checked Exceptions
ClassNotFoundException - Класс не найден
NoSuchMethodException - Запрошенный метод не существует
IllegalAccessException - Запрещен доступ к классу.
и другие
-
Можно ли обработать непроверяемое исключение?
Да, непроверяемые исключения в Java можно обработать с помощью блока try-catch. Хотя для непроверяемых исключений блок try-catch не является обязательным, иногда может быть полезным обработать такие исключения внутри блока try-catch, чтобы убедиться, что программа не завершится аварийно.
Если какой-то метод может выбросить непроверяемое исключение, мы можем заключить вызов этого метода в блок try-catch, чтобы обработать исключение в случае его возникновения. В этом случае, блок catch может содержать код, который исправляет ошибку или предупреждает пользователя об ошибке.
Здесь мы попытались обратиться к элементу массива, который не существует, и возникло исключение ArrayIndexOutOfBoundsException. Однако блок catch перехватил это исключение и вывел сообщение об ошибке вместо аварийного завершения программы.
-
Нужно ли ловить Error исключения?
Ошибка (Error) - возникает на уровне JVM и не может быть обработана программистом (закончилась память в компьютере или переполнен стек – и взять её неоткуда, поэтому и обрабатывать смысла нет)
-
Как бросить исключение? Можно ли бросить НЕ новое исключение?
Бросить – методом throw new()
Да, в Java можно бросить не новое исключение. Это делается с помощью ключевого слова throw. Оно принимает любой экземпляр Throwable (или его производных) - это суперкласс для всех типов исключений.
Например, следующая строка кода бросает некоторое уже существующее исключение:
throw new IllegalArgumentException("Invalid argument");
Где возможно вызывать исключения?
В любом месте кода с помощью throw new Exception();.
-
Расскажи про информацию, которая находится внутри исключения? Как с ней работать?
Каждый раз, когда при выполнении программы происходит ошибка, создается объект-исключение, содержащий информацию об ошибке, включая её тип и состояние программы на момент возникновения ошибки.
Исключение содержит в себе stacktrace(стектрейс вызовов), т.е. последовательность вызванных методов, а также номер строки, на которой возникла ошибка.
Мы можем вызвать массив элементов СтэкТрэйсЭлемент через метод getStackTrace у объекта исключения и получить информацию о классе, методе где было выброшено исключение.
Получить информацию можно по индексу элемента массива StackTraceElement.и получить информацию об имени файла, имени модуля, имени класса, имени метода, номер строки. (методы getClassName, getMethodName, getLineNumber и тд)
-
Что такое подавленные исключения? Как достать подавленное исключение?
Если речь идёт о try with resource то Подавленные исключения (suppressed exception) образуются, когда в блоке try генерируется исключение и в методе close() при закрытии ресурса генерируется исключение, в этом случае первое исключение считается главным остальные подавленные.
Так же следует учитывать, что даже если в методе close() будет сгенерировано исключение и оно добавится к подавленным исключениям для блока try, все они заменятся исключением, которое будет сгенерировано блоком finally.
С помощью метода Throwable.addSuppressed
-
Какую информацию можно получить из StackTraceElement?
StackTrace – это стэк (работает по принципу Last In First Out) с вызванными методами во время работы программы. (трассировка стека – это список методов, которые были вызваны до момента, когда в приложении произошло исключение.)
Первым идёт строка с описанием проблемы (название потока, класс ошибки, причина), далее названия методов в порядке вложенности.
Получить информацию можно по индексу элемента массива StackTraceElement.и получить информацию об имени файла, имени модуля, имени класса, имени метода, номер строки. (методы getClassName, getMethodName, getLineNumber и тд)
-
Расскажи про конструкцию try-catch-finally?
На стадии разработки программы мы «ограждаем» опасные участки кода в отношении исключений с помощью блока try{}, предусматриваем «запасные» пути с помощью блока catch{}, в блоке finally{} мы пишем код, который выполняется в программе при любом исходе.
-
try – определяет блок кода, в котором может произойти исключение; -
catch – определяет блок кода, в котором происходит обработка исключения; -
finally – определяет блок кода, который является необязательным, но при его наличии выполняется в любом случае независимо от результатов выполнения блока try.
-
Что такое try-with-resources? Как работает эта конструкция?
Первоначально он был представлен в Java 7, и вся идея заключалась в том, что разработчику не нужно беспокоиться об управлении ресурсами для ресурсов, которые они используют только в одном блоке try-catch-finally. Это достигается за счет устранения необходимости в finally , которые на практике разработчики использовали только для закрытия ресурсов.
Java понимает это так - Ресурсы, открытые в круглых скобках после оператора try, понадобятся только здесь и сейчас. Я вызову их .close() как только закончу работу с блоком try. Если в блоке try возникает исключение, я все равно закрою эти ресурсы.
Для работы с несколькими ресурсами, мы можем перечислить их в скобках после try через точку с запятой.
Ресурс – это объект класса, реализующего интерфейсы AutoCloseable или Closeable.
-
Расскажи, как правильно ловить исключения? Иерархия catch блоков
Сначала должны идти более специальные блоки обработки исключений, а потом уже более общие.
-
Можно ли одном catch обработать несколько исключений?