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. Первые три — стандартная структура вашего блока. По шагам:
- Оператор или часть кода, в которой вам надо отыскать ошибку, помещается в блок try.
- Далее в блоке catch вы указываете, что за исключение надо ловить и как его обрабатывать.
- В блоке 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