Понимание иерархии исключений в Java объяснил

Опубликовано: 2022-03-08

Термин «Исключение» является сокращением от «исключительное событие». В Java исключение — это, по сути, событие, которое происходит во время выполнения программы и нарушает нормальный ход программы. Исключения нежелательны и в основном неожиданны, они обычно возникают либо во время выполнения, либо во время компиляции. Все эти исключения необходимо обрабатывать, чтобы программа работала в своем естественном потоке.

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

Оглавление

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

Иерархия исключений в языке программирования Java начинается с класса Throwable, который происходит от класса Object и является его прямым подклассом, в то время как класс Exception представляет весь этот класс Throwable и далее разветвляется на два подкласса — Error и Exception. Вот блок-схема, чтобы лучше понять иерархию исключений Java:

Класс Exception представляет все исключения, которые вам могут понадобиться при работе с языком программирования Java. Некоторые общеизвестные и часто встречающиеся примеры таких исключений включают NullPointerException, ClassNotFoundException, IllegalArgumentException и т. д.

С другой стороны, класс Error заботится о более серьезных проблемах в архитектуре вашей Java-программы, а не в коде приложения. Некоторыми примерами ошибок в Java являются InternalError, AssertionError, OutOfMemoryError и т. д.

Исключения в Java далее делятся на две категории:

  • Проверенные исключения — они также известны как исключения времени компиляции.
  • Непроверенные исключения — их также называют исключениями во время выполнения.

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

Ошибки и исключения в Java — чем они отличаются?

Официальная документация по языку программирования Java относится к ошибкам как к событиям во время вашего программирования на Java, которые «указывают на серьезные проблемы, которые разумное приложение не должно пытаться отловить». Серьезность ошибок очевидна из того, как сформулировано это заявление. Ясно, что это относится к набору проблем, с которыми может столкнуться ваша программа и которые невозможно устранить без рефакторинга кода или изменения архитектуры Java-приложения.

Давайте посмотрим на метод Java, который выдаст ошибку:

public static void print(String S) {

печать (С);

}

В коде, упомянутом выше, метод print() действует как рекурсивный метод, который постоянно вызывает сам себя, снова и снова, пока не достигнет максимально допустимого размера для стека потоков в Java. В этот момент он завершает выполнение с очень распространенным — StackOverflowError, который читается примерно так:

Исключение в потоке «основной» java.lang.StackOverflowError

в StackOverflowErrorExample.print(StackOverflowErrorExample.java:3)

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

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

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

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

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

Исключения времени компиляции

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

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

общественные недействительными writeAFile () {

try (BufferedWriter b_w = новый BufferedWriter(новый FileWriter("myFile.txt"))) {

b_w.write("Тестирование");

} поймать (IOException ioe) {

ioe.printStackTrace();

}

}

Как видите, в блоке try приведенного выше кода есть два оператора:

  • Создание экземпляра объекта – BufferedWriter
  • Использование объекта для записи в файл

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

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

В отличие от исключений времени компиляции, которые возникают во время компиляции, исключения времени выполнения или непроверенные исключения могут быть вызваны «в любое время», что по сути означает во время выполнения. В результате этого методам не нужно явно использовать блоки перехвата и выброса для обработки этих непроверенных исключений. Некоторые из классов, которые наследуют непроверенные исключения времени выполнения, включают NullPointerException, ArithmeticException и т. д.

Давайте посмотрим на фрагмент кода Java, который создает непроверенное исключение NullPointerException и не обрабатывается в этом фрагменте кода, в отличие от предыдущего. Вот:

общественные недействительными writeToFile () {

попробуйте (BufferedWriter b_w = null) {

b_w.write("Тест");

} поймать (IOException ioe) {

ioe.printStackTrace();

}

}

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

Исключение в потоке «основной» java.lang.NullPointerException

в IOExceptionExample.writeToFile(IOExceptionExample.java:10)

в IOExceptionExample.main(IOExceptionExample.java:17)

В заключение

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

В upGrad у нас есть специализированный курс разработки полного стека — Программа Executive PG в разработке программного обеспечения — Специализация в разработке полного стека — где мы познакомим вас со всеми нюансами разработки программного обеспечения, сосредоточив основное внимание на разработке полного стека. Мы предлагаем вам ознакомиться с курсом и, возможно, забронировать место в ближайшее время!

1. Какой класс находится на вершине иерархии исключений в Java?

Класс Throwable находится на вершине иерархии исключений в Java.

2. Какие типы исключений существуют в Java?

Java имеет непроверенные, а также проверенные исключения. Проверенные исключения также называются исключениями времени компиляции, тогда как непроверенные исключения также называются исключениями времени выполнения.

3. Как обрабатываются исключения в Java?

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