В этом руководстве по исключениям Java вы узнаете, что такое исключение в Java, и в чем разница между проверенным и непроверенным исключением. Мы также изучим некоторые лучшие практики обработки исключений Java.
1. Что такое исключение в Java?
«Исключение — это неожиданное событие, произошедшее во время выполнения программы и нарушающее нормальный поток инструкций».
- В Java все ошибки и исключения имеют тип с классом Throwable.
- Когда в методе возникает ошибка, метод создает объект(или любой подтип Throwable) и передает его системе выполнения. Этот объект называется объектом исключения.
- Объект исключения содержит информацию об ошибке, включая тип исключения и состояние программы на момент возникновения ошибки.
- Создание объекта исключения и передача его системе выполнения называется выдачей исключения.
Вот несколько примеров исключения при выполнении программы:
- Пользователь вводит буквенно-цифровые данные, а программа исключает цифровой ввод.
- Программа пытается прочитать файл, но файл не существует в указанном месте.
- Сетевое соединение было прервано во время чтения данных из веб-сервиса.
try {Integer.parseInt("six") ; //This line throws an exception}catch(NumberFormatException nfe) {//handle exception}
2. Обработка возникшего исключения
У нас есть два варианта, когда в нашем приложении создается объект исключения;
- Либо мы обработаем это внутри метода, используя блок try-catch.
- Или мы можем передать его вызывающему методу, чтобы он обработал его.
Это очень важное решение, которое необходимо принять при определении обязанностей метода.
Метод должен четко указывать, какие исключения он будет обрабатывать, а какие нет. Это определяется в объявлении метода с помощью ключевого слова throws.
Чтобы обработать исключение, мы должны перехватить исключение в разделе catch блока try-catch.
пытаться {//код}поймать(Исключение e) {//обработка исключения}
Если исключение не обрабатывается в приложении, то оно передается в JVM. JVM обычно завершает программу.
3. Проверенное исключение против непроверенного исключения
В Java исключения можно условно разделить на две категории:
- Проверенные исключения
- Непроверенные исключения

3.1 Проверенные исключения
Проверяемые исключения — это те исключения, которые, как следует из названия, метод должен обработать в своем теле или передать вызывающему методу, чтобы вызывающий метод мог их обработать.
Проверяемые исключения проверяются компилятором Java, поэтому они называются исключениями времени компиляции.
Компилятор Java заставляет нас каким-то образом обрабатывать эти исключения в коде приложения. Мы должны обрабатывать эти исключения на подходящем уровне внутри приложения, чтобы информировать пользователя о сбое и просить его повторить попытку или прийти позже.
Обычно проверенные исключения обозначают сценарии ошибок, находящиеся вне непосредственного контроля программы. Обычно они возникают, когда программа взаимодействует с другими системами/сетевыми ресурсами, например, ошибки базы данных, ошибки сетевого подключения, отсутствующие файлы и т. д.
Обратите внимание, что все проверенные исключения являются подклассами класса Exception. Например,
- ClassNotFoundException
- IOException
- SQLException
Пример проверенного исключения
FileNotFoundException — это проверяемое исключение в Java. Каждый раз, когда мы хотим прочитать файл из файловой системы, Java заставляет нас обрабатывать ситуацию ошибки, когда файл может отсутствовать в нужном месте.
public static void main(String[] args){FileReader файл = новый FileReader("somefile.txt");}
В приведенном выше примере вы получите ошибку времени компиляции с сообщением — Необработанное исключение типа FileNotFoundException.
Чтобы программа могла скомпилироваться, мы должны обработать эту ошибку в блоке try-catch. Ниже приведен код, который будет скомпилирован абсолютно нормально.
public static void main(String[] args){пытаться{FileReader файл = новый FileReader("somefile.txt");}поймать(FileNotFoundException e){//Альтернативная логикаe.printStackTrace();}}
3.2 Непроверенное исключение
Непроверенные исключения не проверяются компилятором. Они называются исключениями времени выполнения. Непроверенные исключения оживают и возникают в программе, как только выполняется какой-либо ошибочный код.
В Java компилятор не заставляет метод-член объявлять непроверяемые исключения в объявлении метода. Как правило, такие методы почти всегда их не объявляют.
Непроверенные исключения являются подклассами класса RuntimeException.
- АрифметическоеИсключение
- ArrayStoreException
- ClassCastException
Странно то, что RuntimeException сам по себе является подклассом Exception, т.е. все непроверяемые классы исключений должны были бы быть неявно проверяемыми исключениями, НО это не так.
Пример непроверенного исключения
Код в данной программе не выдает никаких ошибок компиляции. Но когда мы запускаем пример, он выдает NullPointerException. NullPointerException — это непроверяемое исключение в Java.
public static void main(String[] args){пытаться{FileReader файл = новый FileReader("pom.xml");файл = ноль;файл.read();}поймать(IOException e){//Альтернативная логикаe.printStackTrace();}}
4. Лучшие практики обработки исключений
- Проверяемые исключения могут использоваться, когда метод может не выполнить то, что он должен. Например, метод с именем prepareSystem(), который предварительно заполняет файлы конфигурации и выполняет некоторую настройку с их помощью. Он может объявить о выдаче FileNotFoundException, что подразумевает, что метод использует файлы конфигурации из файловой системы, а они отсутствуют.
- В идеале проверяемые исключения никогда не следует использовать для ошибок программирования, но их обязательно следует использовать для ошибок ресурсов и управления потоком в таких случаях.
- Выбрасывайте только те исключения, которые метод не может обработать никакими способами. Метод должен сначала попытаться обработать его, как только он его встретит. Выбрасывайте исключение только в том случае, если его невозможно обработать внутри метода.
- Хорошим способом определения сигнатур методов является объявление исключений рядом с именем метода. Если метод называется openFile(), то ожидается, что он выдаст FileNotFoundException?. Если метод называется findProvider(), то ожидается, что он выдаст NoSuchProviderException.
- Кроме того, эти типы исключений следует проверять, поскольку это заставляет вызывающую функцию иметь дело с проблемами, присущими семантике методов.
- Если мы создаем какое-либо пользовательское исключение, то правило таково: если можно обоснованно ожидать, что клиент восстановится после исключения, сделайте его проверяемым исключением. Если клиент не может ничего сделать для восстановления после исключения, сделайте его непроверяемым исключением.
5. Заключение
В этом уроке Java мы узнали об исключениях Java. Мы узнали разницу между проверенными и непроверенными исключениями в Java и как обрабатывать непроверенные исключения и иерархию исключений в Java с примерами.
Помните, что самое большое различие между проверенными и непроверенными исключениями заключается в том, что проверенные исключения принудительно вызываются компилятором и используются для указания исключительных условий, находящихся вне контроля программы, в то время как непроверенные исключения возникают во время выполнения и используются для указания ошибок программирования.