Тема исключений затрагивает большой материал, и по этому я разделить ее на две части, в первой мы говорили об исключении и его синтаксисе об этом вы можете почитать здесь. А вот сейчас мы поговорим во второй части нашей статьи, о типах исключений. Исключение и его подклассы используются для исключительных условий, что бы пользовательские программы могли их поймать и обработать, что бы предотвратить сбой работы программы. Вы можете создать подкласс Exception для создания собственных пользовательских типов исключений.
Ошибка определяется исключением, которое не должно быть поймано в нормальных условиях выполнения программы. Работа системы Java об ошибках приложения, заключается в том что бы указать на ошибки в среде исполнения. Переполнение стека является примером такой ошибки.
Неперехваченные исключения
Эта небольшая программа показывает пример java исключения. Она включает в себя выражение, которое преднамеренно вызывает ошибку деления на ноль:
1 2 3 4 5 6 7 8 |
//nookery.ru public class Test { public static void main(String args[]) { int resualt=20/0; } } |
Результатом работы программы будет:
Exception in thread «main» java.lang.ArithmeticException: / by zero
Рассмотрим эту же программы но, момент вычисления поместим в отдельный метод и посмотрим на работу программы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package TestPackage; //nookery.ru public class Test { public static void delenie(){ int resualt=20/0; } public static void main(String args[]) { delenie(); } } |
Результатом работы программы будет:
Exception in thread «main» java.lang.ArithmeticException: / by zero
at TestPackage.Test.delenie(Test.java:8)
at TestPackage.Test.main(Test.java:13)
Здесь мы видим в результате трассировки стека из обработчика исключений, как отображается весь стек вызовов.
Встроенные исключения в Java.
Если исключения подкласса RuntimeException не может быть включена в любой из методов throws списка. Они называются незарегистрированными исключениями. Незарегистрированные исключения, определенные в java.lang, я специально для вас составил java список исключений:
исключение | Описание |
ArithmeticException | Арифметика ошибка, например, деление на ноль. |
ArrayIndexOutOfBoundsException | Индекс массива выходит за пределы поля. |
ArrayStoreException | Присвоение элементу массива несовместимого типа. |
ClassCastException |
Недопустимое приведение
|
EnumConstantNotPresentException | Сделана попытка использовать неопределенное значение перечисления. |
IllegalArgumentException | Нелегальная аргумент, используемый для вызова метода. |
IllegalMonitorStateException | Незаконная операция монитора, например, ожидание на разблокированный поток. |
IllegalStateException | Окружающая среда или приложение в некорректном состоянии. |
IllegalThreadStateException | Запрошенная операция не совместима с текущим состоянием потока. |
IndexOutOfBoundsException | Некоторые тип индекса выходит за пределы поля. |
NegativeArraySizeException | Массив создается с отрицательным размером. |
Исключение нулевого указателя | Неправильное использование нулевой ссылки. |
NumberFormatException | Неправильное преобразование строки в числовой формат. |
SecurityException | Попытка нарушить безопасность. |
StringIndexOutOfBounds | Попытка индекса за пределы строки. |
TypeNotPresentException | Тип не найден. |
UnsupportedOperationException | Неподдерживаемая операция была обнаружена. |
Проверяемые исключения перечислены в следующей таблице:
Исключение | Описание |
ClassNotFoundException | Класс не найден. |
CloneNotSupportedException | Попытка клонировать объект, который не реализует интерфейс Cloneable. |
IllegalAccessException | Доступ к классу запрещен. |
InstantiationException | Попытка создать объект абстрактного класса или интерфейса. |
InterruptedException | Один поток был прерван другим потоком. |
NoSuchFieldException | Запрашиваемый поле не существует. |
NoSuchMethodException | Запрашиваемый метод не существует. |
Java класс пользовательские исключения.
Вы можете создать свой собственный класс исключений , путем определения подкласса исключений.
Класс исключений не определяет никаких собственных методов. Он наследует методы , предоставляемые Throwable .
Следующая программа создает пользовательский тип исключения.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
//nookery.ru class MyException extends Exception { private int i; MyException(int a) { i = a; } public String toString() { return "MyException[" + i + "]"; } } public class Test { static void port(int a) throws MyException { System.out.println("Слушаем порт(" + a + ")"); if (a > 10) throw new MyException(a); System.out.println("Выход"); } public static void main(String args[]) { try { port(8); port(26); } catch (MyException e) { System.out.println("Ошибка " + e); } } } |
Результатом работы программы будет:
Слушаем порт(8)
Выход
Слушаем порт(26)
Ошибка MyException[26]
Java прикованные исключения.
Прикованные исключение позволяют связать одно исключение с другим исключением. Происходит процесс в котором второе исключение описывает причину первого исключения.
Ниже я привел пример, который иллюстрирует механику обработки прикованных исключения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//nookery.ru public class Test { static void demo() { NullPointerException e = new NullPointerException("Ошибка №1"); e.initCause(new ArithmeticException("Ошибка №2")); throw e; } public static void main(String args[]) { try { demo(); } catch (NullPointerException e) { System.out.println("Вывод: " + e); System.out.println("Вывод: " + e.getCause()); } } } |
Результатом работы программы будет:
Вывод: java.lang.NullPointerException: Ошибка №1
Вывод: java.lang.ArithmeticException: Ошибка №2