В этой статье мы подробно обсудим основные и продвинутые концепции исключений. Это хорошая справочная статья для подготовки к собеседованию.

Итак, приступим…

Исключение Java: основы

Исключения можно разделить на две категории: отмеченные исключения и неотмеченные исключения.

Проверенные и непроверенные исключения

Проверенные исключения проверяются во время компиляции, что означает, что система выдает ошибку компиляции, если вы не обработали проверенное исключение.

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

Проверенные исключения: исключения проверяются во время компиляции. Он создается путем расширения класса Exception. Например: IOException, SQLException, ClassNotFoundException

Непроверенные исключения: исключения проверяются во время выполнения. Он создается расширением класса RuntimeException. Например: ArethemeticException, NullPointerException, NumberFormatException.

На изображении выше показан пример исключения компиляции, которое не обрабатывается в основном методе. Метод Class.forName(String classname) выдает ClassNotFoundException. Итак, здесь, на изображении выше, вы можете видеть, что при вызове метода Class.forName система выдает ошибку компиляции в основном методе, потому что int - это основной метод, который должен потребоваться для обработки исключения с помощью блока try-catch Или выбрасывает ключевое слово с методом.

Ниже показана обновленная функция путем добавления блока try-catch, окруженного методом main(), а во втором фрагменте кода поясняется исключение, устраненное путем добавления throws keywords в основной метод.

Иерархия исключений Java

Теперь давайте очень быстро рассмотрим классы иерархии исключений Java. java.lang.Throwable - это корневой класс для всех исключений - это ошибки. В основном он был расширен двумя классами: один is java.lang.Exception для обработки исключительных ситуаций, а другой - java.lang.Error для обработки ошибок.

В разделе "Исключения" все зарегистрированные или исключения времени компиляции создаются путем расширения java.lang.Exception, а все неотмеченные исключения создаются путем расширения the java.lang.RuntimeException, а java.lang.RuntimeException - конкретный класс, расширенный на java.lang.Exception.

На изображении ниже объясняется иерархия исключений.

Исключение и ошибка

Ошибка: состояния, которые нельзя исправить обработкой. Например: OutOfMemoryError, StackOverflowError, AssertionError.

Исключение: это исправимые условия. Все отмеченные и непроверенные исключения являются примерами этого.

Исключения, созданные в Java

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

Далее следует набор часто используемых встроенных исключений Java.

IllegalArgumentException: исключение выдается, если аргумент метода был недопустимым или несоответствующим.

IllegalStateException: исключение выдается, если метод вызывает недопустимое или несоответствующее время.

NullPointerException: это наиболее частое исключение. Это исключение возникает, если система ожидает объект, но на самом деле он был пустым.

IndexOutOfBoundsException: это исключение означает, что индекс находится вне допустимого диапазона.

ConcurrentModificationException: если одновременная модификация происходит в методе, который недопустим, то это сгенерировано

UnsupportedOperationException: если запрошенная операция не поддерживается, возникает исключение UnsupportedOpertionException.

ArithmeticException: генерируется, если возникает исключительное арифметическое условие

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

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

Выше мы видели различные исключения Java. Здесь давайте посмотрим, как поступить в исключительной ситуации.

Исключения обрабатываются с помощью блока try-catch. Далее следует общий синтаксис блока try-catch. Здесь блок finally - необязательный.

try {
//block of code for handling exception
} catch (Exception e) {
//if an exception occurs while the execution of try block. Then the execution stops at that point and this catch block triggers
} finally {
//If an exceptional situation happens or not the finally block definitely executes. This block is optional
}

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

try {
//block of code for handling exception
} catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
//If ArithemeticException or ArrayIndexOutOfBoundsException occurs then this catch block executed
} catch (Exception ee) {
//This catch block executed exceptions other than ArithemeticException or ArrayIndexOutOfBoundsException. Because ArithemeticException and ArrayIndexOutOfBoundsException are handled on above catch block
} finally {
//Exception happens or not this block surely executed
}

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

Создать собственное исключение

В приведенной выше иерархии исключений мы видели различные встроенные исключения Java. Точно так же он может создать свое исключение или ошибку.

Но предположим, что я собираюсь сделать собственное исключение для своего блока кода. Но какое исключение я должен сделать? Исключение времени компиляции или исключение времени выполнения. Как решить, какое исключение сделать для конкретного сценария.

Используйте отмеченное исключение, которое можно ожидать от вызывающей функции.

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

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

Ниже я создал класс исключений времени компиляции под названием ValidationException. В main() программировании он проверяет заявления о приеме на работу от разных кандидатов. Если кандидат соответствует требованиям для работы, система обрабатывает заявку кандидата, если нет, то система выдает созданный нами ValidationException .

Вот ValidationException class.

Вы можете видеть, что класс ValidationException - это исключение времени компиляции или проверенное исключение, поскольку он расширен классом Exception class.

Далее следует основной класс JobApplication all logic, связанный с нашим приложением о вакансиях, написанным внутри этого класса.

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

Processing Application -----> Ram
Processing Application -----> Binu
-----------------Rejected Application------------------
Rejecting : Jomon ||| Reason : Candidate Under Experianced
-------------------------------------------------------
-----------------Rejected Application------------------
Rejecting : Ravi ||| Reason : Candidate Under Qualified

Исключение - проблемы с собеседованием

Теперь давайте обсудим некоторые общие вопросы собеседования об исключениях Java.

1 # Множественные проблемы с блокировкой захвата

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

Перейдем к этому примеру.

Вы можете найти что-нибудь не так в приведенном ниже блоке кодов?

Приведенный выше блок кода неверен. В строке номер 5 отображается следующая ошибка.

Unreachable catch block for ArithmeticException. It is already handled by the catch block for Exception.

Потому что все исключения ArithementicExceptions являются исключениями. Таким образом, если возникает исключение ArithemeticException, оно улавливается блоком Exception в строке номер 3 и не использует блок ArithemeticException catch.

Если я переставлю блок захвата, как показано ниже, он будет работать нормально.

Здесь все ArithemeticException перехватываются блоком ArithemeticException catch, а все остальные исключения попадают в Exception block.

Также под блоком ошибок компиляции результатов кода отображается сообщение об ошибке The exception ArithmeticException is already caught by the alternative Exception

2 # Попробуй-поймай-наконец-то проблема

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

Выше показан пример блока try-catch-finally. Здесь соединение создается на блоке try. Если при создании соединения (SQLException) происходит какое-либо исключение, оно перехватывается блоком catch в строке 5. В блоке finally происходит закрытие соединения. Если блок try вызывает исключение или нет, в любом состоянии выполняется блок finally и пытается закрыть соединение.

А теперь перейдем к другому примеру try-catch.

В приведенном ниже блоке кода нет блока catch, есть только try и finally. Возможно ли это?

В приведенном выше примере нет блока catch для обработки, если есть какое-либо исключение, созданное блоком try, но есть finally block.

Разрешенный выше код Java.

Если блок try выдает исключение. Выполнение блока try останавливается на этом этапе и, наконец, выполняется блок.

3 # Проблемы переопределения методов

Давайте перейдем к выяснению того, как работает исключение при переопределении метода. Давайте рассмотрим это подробно на некоторых примерах.

Рассмотрим следующий интерфейс MyCalculations.

Я собираюсь написать приведенную выше реализацию интерфейса следующим образом. Это работает?

Нет. Это не сработает. Поскольку переопределенные методы вызывают исключение, должны быть такими же, как и родительская функция, реализованная в интерфейсе.

Перейдем к другой проблеме. Ниже показаны два класса: один - BasicCalculation , а другой - AdvancedCalculation , который расширен классом BasicCalculation class и переопределяет функцию добавления в BasicCalculation class. Единственная разница в том, что функция BasicCalculation.add выдает Exception, а функция AdvanceCalculation.add выдает ArithemeticException. Возможно ли это в java?

Да… .. Java позволяет это…

Потому что ArithemeticException - это расширенная версия класса Exception. В переопределенном методе разрешены классы исключений более высокого уровня.

Но предположим, что сценарий типа BasicCalculation.add method выдает ArithemeticException , а метод AdvancedCalculation.add выдает Exception. Java не допускает этого сценария. Потому что исключение в переопределенном классе должно быть на том же или более высоком уровне. Здесь речь идет о низком уровне

Исключения - передовой опыт

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

1 Первый важный момент об исключении - использовать блок перехвата исключений. Не делайте его пустым. Внутри блока catch напишите все, что необходимо для обработки соответствующего исключения. например, вывод сведений об исключении в журналы, передача сведений вызывающим методам, добавление кода на случай возникновения исключения… и т. д.

2 Если вы создаете исключение, не создавайте пустым образом отмеченное или непроверенное исключение. Сначала проанализируйте ситуацию, в которой вы создаете исключение. Проверьте, возможно ли выйти из этой ситуации. На основании этого сделайте проверку на непроверенное исключение.

3 Не используйте повторно классы Exception, RuntimeException или Throwable. Это суперклассы исключений. Выбрасывайте только расширенные классы из этих суперклассов.

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

5 Всегда документируйте исключение, вызванное методом, с помощью аннотации @throws. Это поможет другим разработчикам узнать об исключении в будущем.

6 Не игнорируйте исключение. Предположим, есть вероятность, что вы хотите игнорировать исключение-ловушку. Затем вам нужно правильно прокомментировать это в блоке catch.