Исключения в Java. Часть 1

Java exception код ошибки

Вернёмся к первой картинке. Посмотрим, что нам сказала Java, когда произошло исключение:

Начинаем разбирать сверху вниз:

— это указание на поток, в котором произошло исключение. В нашей простой однопоточной программе это поток main.

— какое исключение брошено. У нас это ArithmeticException. А java. lang. ArithmeticException — полное название класса вместе с пакетом, в котором он размещается.

— весточка, которую принесло исключение. Дело в том, что одно и то же исключение нередко возникает по разным причинам. И тут мы видим стандартное пояснение «/ by zero» — из-за деления на ноль.

— это самое интересное: стектрейс.

Стектрейс (Stack trace) — это упорядоченный список методов, сквозь которые исключение пронырнуло.

У нас оно возникло в методе hereWillBeTrouble на 8-й строке в классе Main (номер строки и класс указаны в скобках синим). А этот метод, в свою очередь, вызван методом main на 3-й строке класса Main.

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

Советую закреплять теорию на практике. Поэтому вернитесь в блок про Error и вызовите метод notGood — увидите любопытный стектрейс.

Как создать исключение

Всё это время мы имели дело с исключением, которое бросает Java-машина — при делении на ноль. Но как вызвать исключение самим?

Раз исключение — это объект класса, то программисту всего-то и нужно, что создать объект с нужным классом исключения и бросить его с помощью оператора throw.

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

А получим мы то же самое, что и в самом первом примере, только вместо стандартной фразы «/by zero» теперь выдаётся наш вопрос-пояснение «ты опять делишь на ноль?»:

Что дальше?

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

Курс

Профессия Java-разработчик PRO

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

Подробнее

Это единая среда разработки (IDE) на Java, JavaScript, Python и так далее. Создана компанией JetBrains.
Подробнее

Подробно про обработку исключений Java

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

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

Введение

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

  • Пользователь ввел неверные данные;
  • Файл не найден;
  • Сетевое соединение было потеряно в середине связи;
  • В JVM закончилась память.

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

Поток исключений

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

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

пример обработки исключения

Ошибки Исключения
1. Невозможно восстановить после ошибки 1. Возможно восстановление из исключений
2. Относятся к типу ‘unchecked’ 2. Исключения могут быть либо «проверенными», либо «непроверенными»
3. Происходят во время выполнения 3. Может произойти во время компиляции или во время выполнения
4. Вызваны средой выполнения приложения 4. Вызвано самим приложением

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

  • Проверенное исключение — это исключение, которое возникает во время компиляции, также называемое исключениями времени компиляции. Если какой-то код в методе выдает проверенное исключение, то метод должен либо обработать исключение, либо указать его с помощью ключевого слова throws.
  • Непроверенное исключение — это исключение, которое возникает во время выполнения. Они также называются исключениями времени выполнения. В C ++ все исключения не проверяются, поэтому компилятор не заставляет их обрабатывать или указывать исключение. Программисты должны определить или отловить исключения.

Пример

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

Типы исключений

Встроенные

Встроенные исключения Описание
ArithmeticException Если в арифметической операции возникло исключительное условие.
ArrayIndexOutOfBoundsException Показывается, чтобы указать, что к массиву был получен доступ с незаконным индексом. Индекс либо отрицателен, либо больше или равен размеру массива.
ClassNotFoundException Это исключение возникает, когда мы пытаемся получить доступ к классу, определение которого не найдено.
FileNotFoundException Когда файл недоступен или не открывается.
IOException При сбое или прерывании операции ввода-вывода.
InterruptedException Когда поток ждет, спит или выполняет какую-то обработку, и он прерывается.
NoSuchFieldException Если класс не содержит указанного поля (или переменной).

Определяемые пользователем исключения

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

Java предоставляет различные методы для обработки исключений, такие как:

  • try
  • catch
  • finally
  • throw
  • throws

Давайте разберемся с каждым из этих методов в деталях.

try block

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

Вложенный блок try

Блок try внутри блока try известен как вложенный блок try в Java.

catch блок

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

Multi-catch блок

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

finally

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

Возможно, вы слышали, что final, finally и finalize — это ключевые слова в Java. Они отличаются друг от друга в разных аспектах.

final finally finalize
ключевое слово блок метод
Используется для применения ограничений на класс, методы и переменные. Используется для размещения важного кода. Используется для выполнения очистной обработки непосредственно перед сбором мусора с объекта.
final class не может быть унаследован, метод не может быть переопределен и значение переменной не может быть изменено. Будет выполняться независимо от того, обрабатывается ли исключение или нет.

Сравнение throw и throws

throw throws
1. Используется для явного создания исключения 1. Используется для объявления исключения
2. Проверенные исключения нельзя распространять только с помощью throw 2. Проверенные исключения могут быть распространены
3. Далее следует выражение 3. Затем следует класс
4. Используется в рамках метода 4. Используется с сигнатурой метода
5. Невозможно создать несколько исключений 5. Можно объявить несколько исключений

Средняя оценка / 5. Количество голосов:

Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.

Исключения Java

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

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

Иерархия

Прежде чем мы перейдём к практике, давайте познакомимся с видами исключений Джава и их иерархией. В основе всего лежит класс Throwable. Все возможные конфликты кода с машиной и пользователем описаны здесь. Для удобства обработки и чтения класс Throwable имеет подклассы Error и Exception. Error – критические ошибки, которые не обязательно происходят по вине пользователя, обработать их невозможно. Exception – собственно конфликты нашей программы, которые необходимо отлавливать.

Взгляните на упрощённую схему иерархии исключений java:

Как видно, блоки делятся на «два лагеря» по цветам — проверяемые и непроверяемые java исключения. Данная классификация показывает, как их воспринимает компилятор: проверяемые – учитывает, непроверяемые – игнорирует. К первому относится Exception в полном составе, кроме RuntimeException. Все остальные классы исключений – непроверяемые компилятором.

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

Создание обработчика

Для обработки исключений java используются следующие операторы: try, catch, finally, throw, throws. Первые три — стандартная структура вашего блока. По шагам:

  1. Оператор или часть кода, в которой вам надо отыскать ошибку, помещается в блок try.
  2. Далее в блоке catch вы указываете, что за исключение надо ловить и как его обрабатывать.
  3. В блоке finally набор обязательных действий при возникновении ошибки. Обычно это запись данных, закрытие ресурсов и пр. Блок исполняется всегда, вне зависимости от срабатывания catch.

Рассмотрим структуру на примере Джава исключения:

try <
// код, где мы хотим отследить ошибку
>
catch (тип_исключения объект_исключения) <
// код обработки
>
finally <
// что нужно выполнить после завершения блока try
>

Если вы хотите обработать несколько исключений – просто создайте ещё один блок catch.

try <
// код, где мы хотим отследить ошибку
>
catch (тип_исключения_1 объект_исключения_1) <
// код обработки
>
catch (тип_исключения_2 объект_исключения_2) <
// код обработки
>
finally <
// что нужно выполнить после завершения блока try
>

С помощью оператора throw вы можете создавать исключения:

На практике это выглядит так:

Student stud1;
public void onClick(View view) <
if(stud1 == null) <
throw new NullPointerException(«Студента не существует»);
>
>

Включим оператор throw в наш стандартный пример с try-catch:

public void onClick(View view) <
if (stud1 == null) <
try <
throw new NullPointerException(«Студента не существует»);
> catch (NullPointerException e) <
Toast. makeText(this, e. getMessage(), Toast. LENGTH_LONG).show();
>
>
>

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

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

тип имя_метода(список_параметров) throws список_исключений <
// код метода
>

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

Операторы try можно вкладывать друг в друга. При этом если вложенный обработчик не имеет своего блока catch, он осуществляет его поиск в родительском операторе. Если и там нет – блок обрабатывается системой.

Готовые и новые исключения

Далее приведём список java исключений, которые вам потребуются в работе чаще других:

  • ArithmeticException — ошибки вычислений.
  • NullPointerException — ссылка на пустое место.
  • NegativeArraySizeException — массив отрицательной размерности.
  • ArrayStoreException — присвоение элементу массива неправильного типа.
  • NumberFormatException — невозможно преобразовать строку в число.
  • IllegalArgumentException — неправильный аргумент при вызове метода.
  • UnsupportedOperationException — указанной операции не существует.
  • TypeNotPresentException — указанного типа не существует.

Все указанные типы java исключений содержатся в классе RuntimeException, а значит, их не надо указывать в блоке throws.

Естественно, система не может содержать всевозможные исключения. Некоторые придётся создавать самостоятельно. Для того, чтобы создать собственное java исключение, вам необходимо унаследовать собственный класс от Exception и переопределить требуемые методы класса Throwable. Или унаследоваться от наиболее близкого по смыслу типа. Рассмотрим на примере программы под android создание java исключения:

import android. os. Bundle;
import android. support. v7.app. AppCompatActivity;
import android. view. View;

public class MainActivity extends AppCompatActivity <

@Override
protected void onCreate(Bundle savedInstanceState) <
super. onCreate(savedInstanceState);
setContentView(R. layout. activity_main);
>

public void testMethod() throws StudentException <
System. out. println(«Возбуждаем StudentException из метода testMethod()»);
throw new StudentException(); // конструктор по умолчанию
>

public void testMethod2() throws StudentException <
System. out. println(«Возбуждаем StudentException из метода testMethod2()»);
throw new StudentException(«Создано во втором методе»);
>

public void onClick(View view) <
try <
testMethod();
> catch (StudentException e) <
e. printStackTrace();
System. out. println(«Исключение перехвачено»);
>

try <
testMethod2();
> catch (StudentException e) <
e. printStackTrace();
>
>

class StudentException extends Exception <
StudentException() <
>

StudentException(String msg) <
super(msg);
>
>
>

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

Источники:

https://skillbox. ru/media/base/isklyucheniya_v_java_chast_1/

https://hr-vector. com/java/exception-handling

https://gb. ru/posts/java_exceptions

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: