Файл: Что такое исключение Для чего они нужны.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 22.11.2023

Просмотров: 21

Скачиваний: 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 обработать несколько исключений?