Главная страница

ооп. 1 Что такое исключение. 2 Иерархия исключений. 3 Как создатьброситьпоймать исключение


Скачать 46.7 Kb.
Название1 Что такое исключение. 2 Иерархия исключений. 3 Как создатьброситьпоймать исключение
Дата20.09.2022
Размер46.7 Kb.
Формат файлаdocx
Имя файла03_ (1).docx
ТипДокументы
#687473

1) Что такое исключение.

2) Иерархия исключений.

3) Как создать/бросить/поймать исключение.

4) В чем разница между checked и unchecked исключениями

5) Что такое стектрейс. Какую информацию из него можно получить?

6) блок finaly

7) Конструкция try-catch-with-resource.

8) Что такое логгирование и для чего используется.

1) Что такое исключение

Событие, которое возникает во время выполнения программы и прерывает нормальный поток выполнения инструкций. Причины возникновения - Пользователь ввел недопустимые данные / Файл не найден / Потеряно соединение.
Зачем нужны исключения?

Исключения используются для обработки ошибок и других особых ситуаций.

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

Можно ли указывать в сигнатуре метода throws unchecked исключения?

Можно (ArrayIndexOutOfBoundsException / ClassCastException / IllegalArgumentException и т.д.)

Чем отличаются исключения от обычных классов?

Исключения должны быть унаследованы от класса Exception или его подкласса RuntimeException

Класс исключений Java — это своего рода класс со специальной функцией, но синтаксис не отличается от обычных классов

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

Все ключевые слова и всё что с ними связано

try - используется для отметки начала блока кода, который потенциально может привести к ошибке

catch - отметка начала блока кода, предназначенного для перехвата и обработки исключений

finally - отметка начала блока кода, которой является дополнительным. Этот блок помещается после последнего блока catch. Управление обычно передаётся в блок finally в любом случае.

throw - служит для генерации исключений (throw new)

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

Все исключения и как генерировать различные виды исключений

Throwable -> Exception ->RuntimeException (unchecked), IOException (checked), ClassNonFoundException (checked) и др, кастомные исключения

Генерировать через try catch и ключевое слово new.

Проверяемое исключение – это значит что оно контролируется компилятором

Где возможно вызывать исключения?

В методе / конструкторе / интерфейсе

Разница try catch и if

Код более читабельный, а обработка ошибок выведена в отдельный блок

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

Исключения можно передавать цепочкой наверх

If можно использовать там где логический оператор подразумевает использование результата в вычислениях, а не контроле потока выполнения

If более производительный, но менее удобный

Try/catch рекомендуется использовать в специфических ситуациях, например при проверке существования файла перед обращением к этому файлу. (if else может проверить его существование, но состояние файла может быть изменено уже после проверки и тогда вы получим исключение и программа упадёт)

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

Каждый раз, когда при выполнении программы происходит ошибка, создается объект-исключение, содержащий информацию об ошибке, включая её тип и состояние программы на момент возникновения ошибки.

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

Мы можем вызвать массив элементов СтэкТрэйсЭлемент через метод getStackTrace у объекта исключения и получить информацию о классе, методе где было выброшено исключение.

Механизм обработки исключений:

1. Создание объекта-исключения

2. Заполнение stack trace'а этого исключения

3. Раскрутка стека в поисках нужного обработчика

К механизму обработки исключений в Java имеют отношение 5 ключевых слов: - try, catch, throw, throws и finally. Схема работы этого механизма следующая. Вы пытаетесь (try) выполнить блок кода, и если при этом возникает ошибка, система возбуждает (throw) исключение, которое в зависимости от его типа вы можете перехватить (catch) или передать умалчиваемому (finally) обработчику.

Что такое ошибка, а что такое исключительная ситуация?

Исключительная ситуация (Exceptions) – ситуация которую мы можем предсказать и обработать.

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

Методы исключений

getMessage(),getCause(),printStackTrace(), getStackTrace()

Что нужно делать программисту, если в коде происходит деление на ноль?

Устранить ошибку

Можно ли так написать try { throw new Object(); }?

Нет, так как Object не наследуется от Throwable

Что происходит если не обработать исключение?

Поток, в котором было выброшено и не обработано исключение, остановится, и распечатает стектрейс в вывод System
2) Иерархия исключений

Класс исключений является подклассом класса Throwable

Помимо класса исключений существует подкласс ошибок (Error), В большинстве случаев Error не нужно обрабатывать (StackOverflowError / OutOfMemoryError)

Все классы исключений представляют подтипы класса java.lang.Exception

Класс исключений делится на два подкласса unchecked и checked:

RuntimeException (unchecked) – исключения на этапе выполнения

IOException (checked) – другие исключения

Какое назначение класса Throwable? Методы класса Throwable

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

Назначение – быть выброшенным

Методы класса Throwable:

getMessage - возвращает описание исключения

getStackTrace - возвращает массив, содержащий поэлементную трассировку стека

printStackTrace - выводит трассировку стека

addSuppressed - добавляет заданное исключение в список подавляемых исключений

fillInStackTrace - возвращает объект класса Throwable, содержащий полную трассировку стека

getCause - возвращает исключение, лежащее в основе текущего исключения. null если такое исключение отсутствует

getLocalizedMessage - возвращает локализованное описание исключения

Зачем создавать свой класс и наследовать его от Exception?

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

Чтобы создать свой класс исключений, надо унаследовать его от класса Exception.

От каких классов Throwable и его подклассов нельзя наследоваться?

Прямого запрета нет, НО Классы-ошибки, расширяющие класс Error, свидетельствуют о возникновении сложных ситуаций в виртуальной машине Java. Их обработка требует глубокого понимания всех тонкостей работы JVM. Не советуют даже выбрасывать ошибки оператором throw. Не следует делать свои классы-исключения расширениями класса Error или какого-то его подкласса

Что такое подавленные исключения?

Подавленное исключение — это исключение, которое выбрасывается, но каким-то образом игнорируется.

Например, мы можем не получить информацию об исключении, вызванным в блоке try в случае если блок finally вызвал своё исключение. В таком случае нам будет необходимо вызвать на объекте второго исключения метод Throwable.addSuppressed чтобы добавить информацию о первом исключении.

Однако, если речь идёт о try with resource то Подавленные исключения (suppressed exception) образуются, когда в блоке try генерируется исключение и в методе close() при закрытии ресурса генерируется исключение, в этом случае первое исключение считается главным остальные подавленные.

Так же следует учитывать, что даже если в методе close() будет сгенерировано исключение и оно добавится к подавленным исключениям для блока try, все они заменятся исключением, которое будет сгенерировано блоком finally.

Как достать подавленное исключение?

С помощью метода Throwable.addSuppressed
3) Как создать/бросить/поймать исключение.

Как создать, выбросить, поймать свое исключение?

Создать – создать класс и унаследоваться от Exception или его наследника.

Бросить – методом throw new()

Поймать – конструкцией try catch
4) В чем разница между checked и unchecked исключениями? В чём разница с точки зрения синтаксиса и идеологическая при использовании?

Checked (проверяемые исключение) мы должны или обработать с помощью try/catch или пробросить дальше добавлением в сигнатуру throws. Непроверямые ни обрабатывать ни делать что-либо ещё не нужно.

Unchecked исключения это не ошибки JVM, но RunTimeException это больше ошибка кода (программиста), которую нужно исправить.

Встроенные исключения:

Unchecked RuntimeException

ArrayIndexOutOfBoundsException - Индекс массива выходит за пределы

ClassCastException - Недопустимое приведение типов

IllegalArgumentException - Недопустимый аргумент, используемый для вызова метода

NullPointerException - Недопустимое использование нулевой ссылки

NumberFormatException - Неверное преобразование строки в числовой формат

Checked Exceptions

ClassNotFoundException - Класс не найден

NoSuchMethodException - Запрошенный метод не существует

IllegalAccessException - Запрещен доступ к классу.

и другие
5) Что такое StackTrace и какую информацию можно получить из StackTraceElement?

StackTrace – это стэк (работает по принципу Last In First Out) с вызванными методами во время работы программы. (трассировка стека – это список методов, которые были вызваны до момента, когда в приложении произошло исключение.)

До возникновения ошибки программа идёт вглубь методов, но как только возникает исключительная ситуация программа начинает идти в обратном порядке и заполняет StackTraceElement. Первым идёт строка с описанием проблемы (название потока, класс ошибки, причина), далее названия методов в порядке вложенности.

Получить информацию можно по индексу элемента массива StackTraceElement.и получить информацию об имени файла, имени модуля, имени класса, имени метода, номер строки. (методы getClassName, getMethodName, getLineNumber и тд)

Что возвращает getStackTrace()?

Возвращает массив элементов StackTrace. (см выше)


6) Блок finaly

Оператор finallу образует блок кода, который будет выполнен по завершении блока операторов try-catch.

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

Конструкция try-finally

Допускается конструкция try-finally без блока catch. Блок finally выполнится в любом случае.

В случае если в блоке try предусмотрен return, блок finally выполнится до return.

Обязателен ли блок finally?

нет

Будет ли выполнен finally при Error?

да

Какой return вернется? Из try или finally?

Выполнится return из блока fianlly

Что если в конструкции try finally вылетело исключение сначала в try а потом в finally? Какое исключение вылетит? Что будет с другим?

Вылетит исключение которые было выброшено в finally, исключение из catch будет подавлено

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

Не будет выполнен в следующих случаях :,

1. Если упала JVM (например случилась проблема с hardware)

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

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

4. Если это поток демон, все не-демон потоки завершились, то он завершится до finally
7) Конструкция try-catch-with-resource.

Первоначально он был представлен в Java 7, и вся идея заключалась в том, что разработчику не нужно беспокоиться об управлении ресурсами для ресурсов, которые они используют только в одном блоке try-catch-finally. Это достигается за счет устранения необходимости в finally , которые на практике разработчики использовали только для закрытия ресурсов.

Java понимает это так - Ресурсы, открытые в круглых скобках после оператора try, понадобятся только здесь и сейчас. Я вызову их .close() как только закончу работу с блоком try. Если в блоке try возникает исключение, я все равно закрою эти ресурсы.

Для работы с несколькими ресурсами, мы можем перечислить их в скобках после try через точку с запятой.

Ресурс – это объект класса, реализующего интерфейсы AutoCloseable или Closeable.

Что такое ресурс в конструкции try-with-resources?

Ресурс – это объект класса, реализующего интерфейсы AutoCloseable или Closeable.

Когда происходит закрытие ресурса в конструкции try-with-resources если в try возникло исключение: до перехода в catch или после того как catch отработает?

In a try-with-resources statement, any catch or finally block is run after the resources declared have been closed

Блок catch будет отработан после того как ресурс будет закрыт

In case a resource throws an exception when you try to close it, any other resources opened within the same try-with-resources block will still get closed. After closing all resources, the exception from the failed close-attempt will get propagated up the call stack.

Если в try с ресурсами, - в try не вылетало исключений, а при закрытии ресурсов возникло исключение - ресурс не закроется (но закроются другие ресурсы объявленные в этом же блоке), а программа аварийно завершится с выводом StackTrace

Порядок создания (инициализации) ресурсов в try-resource? –

В обратном порядке. От последнего к первому.

Что если исключение вылетело сначала в try, а потом в close в конструкции try-with-recources? Какое исключение вылетит? Что будет с другим?

Если речь идёт о try with resource то Подавленные исключения (suppressed exception) образуются, когда в блоке try генерируется исключение и в методе close() при закрытии ресурса генерируется исключение, в этом случае первое исключение считается главным остальные подавленные.

Так же следует учитывать, что даже если в методе close() будет сгенерировано исключение и оно добавится к подавленным исключениям для блока try, все они заменятся исключением, которое будет сгенерировано блоком finally.
Catch

Блок кода с описанием логики и действий при возникновении указанной исключительной ситуации

Обязателен ли блок catch?

Блок catch не обязателен

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

ДА. Пока классы этих исключений можно отследить вверх по иерархии наследования классов до одного и того же суперкласса, можно использовать только этот суперкласс.

Какое правило должно соблюдаться при использовании нескольких блоков catch (с одним try)?

По иерархии от младшего к старшему

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

Это называется multi-catch — многократный перехват. В нём можно перечислить несколько исключений, разделив их знаком | по иерархии (слева младше, справа старше)

8) Что такое логгирование и для чего используется.

Логирование — это процесс, при котором программа записывает сведения о своем исполнении в файл или базу данных. Логирование дает возможность отслеживать ход исполнения программы.

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

Лог-файлы помогают «следить» за действиями программы, например, что она функционирует в конкретный момент времени или как она реагирует на действия пользователя.

У одного программного продукта лог-файлы могут быть разные. Например, может быть лог-файл типа:«access_log», в котором фиксируется взаимодействие с пользователями;

«error_log», в котором фиксируются все ошибки, произошедшие в результате работы программы;

Logger —объект, который отвечает за запись информации в лог-файлы, опираясь на заданные уровни логирования. Logger это статическое поле класса инициализируемое при загрузке класса, имеет простое, короткое имя, важно чтобы во всех Ваших классах переменная логера называлась одинаково.

Имя логгера не обязательно должно совпадать с именем класса, но как показывает практика выдумывать и главное потом неукоснительно следовать такой иерархии крайне сложно.
Имя логера берется как Class.class.getName() а не как «com.dataart.demo.java.logging.SomeClass»

Appender или Handlers — конечная точка (файл/консоль/БД), куда записывается информация.

Layout — формат, в котором выводятся сообщения

Логгеры - JUL(Java.util.logging) / Logback / SLF4J
Какие есть уровни логирования и для чего они нужны?

OFF - сообщения не выводятся;

SEVERE - ошибка, после которой приложение будет остановлено, например, JVM out of memory error

WARNING - логи, которые содержат предостережение. Произошло неожиданное действие, но система устояла и выполнила запрос;

INFO - важные действия в приложении. Это не предостережение, это ожидаемые действия системы

CONFIG -

FINE -

FINER - сообщения об успешной операции

FINEST -

ALL— выводится вся информация.
«Поддержать» уровни логирования в Java можно двумя способами:

  • Внутри программы можно расставить вызов нужной библиотеки в соответствии с заданным уровнем.

  • В момент запуска программы нужно указать уровень логирования для конкретной ситуации. Если ничего не указывать, то для программы будет применяться уровень «info»

Обязательно ли передавать в метод getLogger() имя класса? Почему так принято?

Logger.getLogger создает один регистратор на класс, а не один регистратор на экземпляр класса. Logger.getLogger(Class) является сокращением для getLogger(clazz.getName()). Соглашение, используемое с log4j и другими фреймворками регистрации, - это определение статического регистратора для каждого класса.

  • Простота использования. Не нужно беспокоиться о дублировании имени регистратора в приложении

  • Легко проверить класс ведения журнала, так как имя регистратора будет отображаться в файле журнала

  • Защита от перенаправления ведение журнала из вашего класса в другой файл или в другое место

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

Пример: имя класса com.github.artemiy.loggingexamp.MainDemo

↓RootLogger - главный узел. Это узел, который принимает все логи всего приложения.

com –следующий узел.

↓com.github

com.github.artemiy

com.github.artemiy.loggingexamp

Сообщения каких уровней мы увидим, задав уровень INFO?

все, что выше INFO

INFO, WARNING, SEVERE

Как Java понимает какой уровень главнее при установке .setLevel().

Метод setLevel() определяет наименьшую степень серьезности, которая будет отправлена в соответствующее место назначения.

Понимает из файла настройки logging.properties по умолчанию в JAVA_HOME/jre/lib


написать администратору сайта