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

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

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

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

Добавлен: 05.02.2024

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

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


equals(Object obj) - сравнивает текущий объект с указанным объектом на равенство;

hashCode() - возвращает хэш-код объекта;

toString() - возвращает строковое представление объекта в формате "ClassName.methodName(FileName:lineNumber)".

Класс StackTraceElement обычно используется вместе с трассировкой стека вызовов исключения, чтобы определить место, где возникло исключение, и проанализировать причину ошибки.

Расскажи про конструкцию try-catch-finally?

Конструкция try-catch-finally - это один из способов обработки исключений в Java. Она позволяет попытаться выполнить определенный блок кода и в случае возникновения исключения обработать его в блоке catch. Кроме того, блок finally позволяет выполнить код независимо от того, было ли исключение или нет.

Конструкция try-catch-finally имеет следующий синтаксис:



Блок try содержит код, который может вызвать исключение. Если исключение произойдет, выполнение кода в блоке try прервется и управление передастся в блок catch, который соответствует типу возникшего исключения. Если блок catch не обнаружит соответствующий тип исключения, оно будет передано в следующий блок catch, если он присутствует.

Блок finally содержит код, который нужно выполнить в любом случае, независимо от того, было ли исключение или нет. Например, этот блок может содержать код для закрытия открытых файлов или сетевых соединений.

Пример использования конструкции try-catch-finally:

В примере используется блок try для открытия файла и выполнения операций с ним. Если файл не найден или произойдет ошибка ввода-вывода, управление передастся в соответствующий блок catch. В блоке finally выполняется закрытие файла, чтобы гарантировать, что ресурсы освободятся независимо от того, было ли исключение или нет.



Что такое try-with-resources? Как работает эта конструкция?

Конструкция try-with-resources в Java представляет собой удобный способ автоматически закрывать ресурсы, такие как файлы или сетевые соединения, после завершения их использования. Эта конструкция была введена в Java 7.

Конструкция try-with-resources позволяет определить один или несколько ресурсов в заголовке try, которые будут автоматически закрыты при выходе из блока try. Синтаксис try-with-resources выглядит следующим образом:

try (ResourceType resource = new ResourceType()) {

// Блок кода, в котором происходит использование ресурса


} catch (Exception e) {

// Обработка исключений

}

В этом коде ResourceType - это тип ресурса, который должен быть закрыт после использования. В заголовке try ресурс инициализируется с помощью оператора new. В блоке try происходит использование ресурса, а затем он автоматически закрывается при выходе из блока try.

Кроме одного ресурса, можно использовать несколько ресурсов в блоке try-with-resources, разделяя их точкой с запятой, например:

try (ResourceType resource1 = new ResourceType(); ResourceType resource2 = new ResourceType()) {

// Блок кода, в котором происходит использование ресурсов

} catch (Exception e) {

// Обработка исключений

}

Ресурсы, используемые в блоке try-with-resources, должны быть реализованы с помощью интерфейса AutoCloseable. Интерфейс AutoCloseable определяет метод close(), который используется для закрытия ресурсов.

Пример использования try-with-resources для чтения содержимого файла:

try (BufferedReader reader = new BufferedReader(new FileReader("filename.txt"))) {

String line;

while ((line = reader.readLine()) != null) {

System.out.println(line);

}

} catch (IOException e) {

System.out.println("Ошибка чтения файла: " + e.getMessage());

}

В этом примере создается экземпляр BufferedReader, который читает содержимое файла "filename.txt". Когда блок try завершается, BufferedReader автоматически закрывается, что гарантирует, что ресурс будет освобожден, даже если возникнет исключение.

Расскажи, как правильно ловить исключения? Иерархия catch блоков

Ловля и обработка исключений в Java выполняется с помощью блока try-catch. Блок try содержит код, который может выбросить исключение, а блок catch используется для обработки выброшенного исключения.

Конструкция catch в Java имеет иерархическую структуру, которая позволяет обрабатывать исключения на разных уровнях иерархии. Каждый блок catch отлавливает определенный тип исключения или его подклассы, начиная с самых конкретных и заканчивая самыми общими.

Если в блоке try выбрасывается исключение, Java ищет соответствующий блок catch, который может обработать это исключение. Если подходящий блок catch не найден, то исключение передается на уровень выше, где происходит его поиск. Если исключение не обрабатывается ни одним блоком catch, программа завершается с выводом сообщения об ошибке.

пример использования блоков try-catch в Java:

try {

// some code that may throw an exception

} catch (ExceptionType1 e) {

// handle exception of type ExceptionType1

} catch (ExceptionType2 e) {

// handle exception of type ExceptionType2

} catch (Exception e) {

// handle exception of type Exception or any of its subclasses

} finally {

// code to be executed regardless of whether an exception was thrown or not

}

В этом примере блок try содержит код, который может выбросить исключение. Затем идут несколько блоков catch, каждый из которых обрабатывает исключения определенного типа или его подклассы. Последний блок catch обрабатывает исключения типа Exception или его подклассы, если ранее не было обработано более конкретных типов исключений.


Блок finally используется для кода, который должен быть выполнен независимо от того, возникло исключение или нет. Например, это может быть код для освобождения ресурсов, таких как файлы или сетевые соединения.

При ловле исключений в Java, важно следовать нескольким правилам:

Не ловите исключения, которые вы не знаете, как обработать. Лучше передать исключение на уровень выше, где оно может быть обработано.

Обрабатывайте исключения, которые вы знаете, как обработать. Это позволит избежать непредвиденного поведения программы.

Не игнорируйте исключения

Можно ли одном catch обработать несколько исключений?

Да, в Java можно использовать один блок catch для обработки нескольких типов исключений. Для этого в блоке catch указываются все типы исключений, которые нужно обработать, перечисленные через вертикальную черту |. Например:

try {

// Код, который может бросать исключения

} catch (IOException | SQLException e) {

// Обработка исключения

}

В данном примере мы используем один блок catch для обработки исключений типа IOException и SQLException. Если возникнет любое из этих исключений, то будет выполнен код в блоке catch. Обратите внимание, что объект исключения e будет иметь тип IOException или SQLException, в зависимости от того, какое исключение было брошено.

Также можно использовать несколько блоков catch для обработки разных типов исключений. В этом случае иерархия catch блоков должна быть от наиболее специфичных исключений к более общим, чтобы избежать конфликтов между блоками.

Иерархия исключений? – Object – Throwable – Exception/Error – Exception (IOException/RunTimeException)
­­­­­­­­­­­­­­­­---------------------------------------------------------------------------------------------------------------------
Чем отличаются исключения от обычных классов?
• Все исключения наследуются от класса Throwable.

• Дело в том, что исключение – класс все-таки выделенный. При создании Throwable существуют большие накладные расходы – заполнение стека вызова. Это достаточно длительная процедура. И потому создавать исключение просто так – себе дороже. Его нужно создавать только тогда, когда без него не обойтись, когда оно точно будет выброшено. Проще это делать сразу вместе с директивой throw.

• А вот держать в классе исключения какую-то информацию, которая позволит его обработать – вполне допустимо. Передавать эту информацию лучше через конструктор.


Все ключевые слова и всё что с ними связано? – Try/Catch/Fynally/Throw/throws

try: блок try содержит код, который может возбуждать исключения. Если исключение возникает, управление передается соответствующему блоку catch.


catch: блок catch перехватывает и обрабатывает исключение, возбужденное в блоке try.

finally: блок finally содержит код, который будет выполнен в любом случае, независимо от того, возникло исключение или нет. Используется для освобождения ресурсов или выполнения других завершающих операций.

throw: оператор throw используется для явного возбуждения исключения в программном коде. Можно использовать свой собственный класс исключения, наследованный от класса Exception или RuntimeException. Синтаксис:

throw new ExceptionType("Сообщение об ошибке");

throws: ключевое слово throws указывает на исключения, которые могут быть возбуждены методом и переданы в вызывающий метод для обработки. Синтаксис:

public void someMethod() throws ExceptionType {

// код, который может возбуждать исключения

Всё исключения и как генерировать различные виды исключений? – throw new ();

Как создать, выбросить, поймать свое исключение? – создать свой класс и наследоваться от Exception/RunTimeException в зависимости от того, какую ошибку нужно обработать.

Где возможно вызывать исключения? в классе, методе, в любом блоке try-catch-finally

Конструкция try-finally?В конструкции Try-Finally, инструкция Finally гарантированно выполнится, абсолютно независимо оттого, что произойдет в предложении Try. Однако, предложение Finally фактически не обрабатывает никаких исключений

Можно ли обрабатывать разные исключения в одном блоке catch? – можно через знак | (прямая черта)

Обязателен ли блок finally? А catch? Когда будет выполнен finally? – конструкция может быть как try/catch так и try/finally (т.е. без catch или finally, но что-то одно обязательно должно быть). Finally будет выполнен всегда, за исключением редких случаев.

Когда не будет выполнен finally(4 случая)? –

Если упала JVM,

Бесконечный цикл в JVM (в блоке try/catch).

Была вызвана команда System.exit,

Если это поток демон, все не-демон потоки завершились, то он завершится до finally

  1. Когда JVM (Java Virtual Machine) выходит из работы. В этом случае выполнение программы прерывается, и блок finally не выполняется.

  2. Когда происходит бесконтрольное завершение работы программы, например, при вызове метода System.exit(). В этом случае выполнение программы прерывается, и блок finally не выполняется.

  3. Когда в блоке finally возникает исключение или ошибка, которые не перехватываются. В этом случае выполнение блока finally прерывается, и исключение или ошибка передается дальше по стеку вызовов.

Будет ли выполнен finally при Error? – да, при ошибке типа Error блок finally также будет выполнен


Разница try catch и if Какой return вернется? Из try или finally? – если оператор return написан и в try и в finally, то выполнится return в finally

Что если в конструкции try finally вылетело исключение сначала в try а потом в finally? Какое исключение вылетит? Что будет с другим? – в случае если исключение вылетело и в try и в finally, то вылетит то, исключение, которое случилось в finally (как и с оператором return). Другое исключение оно просто «проглотит», если не было блока catch.

Расскажи про информацию, которая находится внутри исключения? Как с ней работать? –

Исключение содержит в себе stacktrace(стектрейс вызовов), т.е. последовательность вызванных функций, а также номер строки, на которой возникла ошибка.

Что возвращает getStackTrace()? – возвращает массив StackTraceElement[] в котором содержатся элементы трассировки стека

Какое правило должно соблюдаться при использовании нескольких блоков catch (с одним try)?– от меньшего к большему. Первыми должны ловиться наименьшие в иерархии исключения. Иначе будут «недостижимые» исключения, которые никогда не будут выполнены программой.

Какое правило должно соблюдаться при попытке поймать несколько исключений в одном catch? – если мы ловим несколько исключений, одно из которых является родителем другого, то мы должны оставить только родителя, иначе компилятор будет ругаться. Исключения прописываются через разделитель |. Переменная объекта ex (Exception ex) является final

Зачем создавать свой класс и наследовать его от Exception? – для создания СОБСТВЕННЫХ проверяемых исключительных ситуаций, которые не предусмотрены JVM или компилятором и последующей обработки этих ситуаций

Что такое ошибка, а что такое исключительная ситуация? – исключительная ситуация – ситуация которую мы можем предсказать и обработать. Ошибка возникает на уровне JVM и не может быть обработана программистом (закончилась память в компьютере или переполнен стек – и взять её неоткуда, поэтому и обрабатывать смысла нет)

Что нужно делать программисту, если в коде происходит деление на ноль? – это ошибка кода, которую программист должен убрать. Или убрать деление на 0 или добавить проверочное условие.

От каких классов Throwable и его подклассов нельзя наследоваться? – технически от класса Error наследоваться не принято, т.к. это ошибки JVM (серьезные ошибки, которые программист итак обработать не может)

Какую информацию можно получить из StackTraceElement?