Что такое исключения java
Перейти к содержимому

Что такое исключения java

  • автор:

Классы исключений

Иерархия классов исключений фото

Исключения (Exceptions) являются результатом проблем в программе, которые в принципе решаемы и предсказуемы. Например, произошло деление на ноль в целых числах.

Ошибки (Errors) представляют собой более серьёзные проблемы, которые, согласно спецификации Java, не следует пытаться обрабатывать в собственной программе, поскольку они связаны с проблемами уровня JVM. Например, исключения такого рода возникают, если закончилась память, доступная виртуальной машине. Программа дополнительную память всё равно не сможет обеспечить для JVM.

У класса Exception имеется важный подкласс — RuntimeException. Исключения этого типа автоматически определяются для создаваемых вами прикладных программ и охватывают такие ошибки, как деление на ноль и ошибочная индексация массивов.

Также исключения делятся по типу на неконтролируемые и контролируемые исключения. Неконтролируемые (unchecked) — RuntimeException, Error и их наследники.

Контролируемые исключения (checked) — все остальные наследники класса Exception.

Пример 1. Контролируемое исключения ParseException

import java.text.NumberFormat; import java.text.ParseException; public class NumberFormatDemo4 < public static void main(String[] args) throws ParseException < NumberFormat nf = NumberFormat.getInstance(); System.out.println(nf.parse("1234,567")); nf.setParseIntegerOnly(true); System.out.println(nf.parse("1234,567")); >> 

Пример 2. Контролируемое исключения ParseException

import java.text.NumberFormat; import java.text.ParseException; public class ExceptionDemo4 < public static void main(String[] args) < try < parseNumber("sss"); >catch (ParseException e) < System.out.println(e.getMessage()); >System.out.println("Конец программы."); > public static void parseNumber(String str) throws ParseException < NumberFormat nf = NumberFormat.getInstance(); System.out.println(nf.parse(str)); >>

Пример 3. Неконтролируемое исключения ArithmeticException

public class ExceptionDemo1 < public static void main(String[] args) < subRoutine(); >public static void subRoutine() < int d = 0; int a = 10 / d; >>

Пример 4. Неконтролируемое исключения ArrayIndexOutOfBoundsException

public class ExceptionDemo2 < public static void main(String[] args) < int[] array = new int[3]; System.out.println(array[4]); >>

Пример 5. Неконтролируемое исключения StackOverflowError

public class StackOverflowErrorExample < public static void main(String[] args) < System.out.println("1"); main(args); >>

Пример 6. Неконтролируемое исключения ClassCastException

public class ClassCastExceptionExample < public static void main(String[] args) < method(new int[0]); >private static void method(Object arg) < String x = (String) arg; >>

Пример 7. Неконтролируемое исключения NullPointerException

public class NullPointerExceptionExample < public static void main(String[] args) < String str = null; System.out.println(str.length()); >>

2. Методы, определенные в классе Throwable

  • Throwable getCause() — возвращает исключение, положенное в основу текущего исключения. Если такое исключение отсутствует, то возвращается пустое значение null.
  • String getLocalizedMessage() — возвращает локализованное описание исключения.
  • String getMessage() — возвращает описание исключения.
  • StackTraceElement[] getStackTrace() — возвращает массив, содержащий поэлементную трассировку стека в виде объектов класса StackTraceElement. На вершине стека находится метод, который был вызван непосредственно перед генерированием исключения. Этот метод содержится в первом элементе массива. Класс StackTraceElement предоставляет доступ к данным о каждом элементе трассировки, например к имени вызванного метода.
  • void printStackTrace() — отображает трассу стека.
  • void printStackTrace(PrintStream stream) — посылает трассу стека указанному потоку.
  • void printStackTrace(PrintWriter stream) — посылает проекцию прямой стека указанному потоку.
  • String toString() — возвращает String-объект, содержащий описание исключения. Этот метод вызывается из println() при выводе Throwable-объекта.
  • Обработка исключений
  • Создание подклассов исключений
  • Оператор try-catch-finally
  • Оператор throw
  • Оператор throws
  • Исключения при наследовании
  • Задания

Исключения в Java

Исключения представляют собой объекты, которые позволяют обработать исключительную ситуацию. Исключительная ситуация— это ошибка, происходящая во время выполнения программы (так называемая ошибка времени выполнения). Основные типы исключений (Exception) в java.

Исключительные ситуации можно обрабатывать с помощью блока try/catch/finally.

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

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

Блок catch может делать все, что угодно: вызывать необходимый класс-исключение при помощи создания его объектов с использованием ключевого слова throw (это фактически искусственная передача выполнения нужному нам блоку catch), а может и сам производить какие-либо действия.

В блоке finally выполняются определенные восстановительные операции. Он обычно предназначен для освобождения памяти, выделенной под объект. Восстановительные операции будут выполняться независимо от того, возникло исключение (теперь мы будем именно так называть исключительные ситуации) в блоке try или нет.

Блок finally может отсутствовать.
Конструкция try/catch/finally может быть вложенной. Покажем использование этой конструкции на примере (листинг 5.1).

Листинг 5.1.
Пример использования конструкции try/catch/finally

class MyException extends Exception < public void MyException() < System.out.println("Возникло исключение. "); >> class Toys < public static short numbers = 0; public static short newNumber() < return ++numbers; >public short number; public String name, size; public void setParam(String name, String size) < try < this.name = name; this.size = size; if (this.number != 0) < throw new MyException(); // Вызов метода создания объекта MyException >this.number = Toys.newNumber(); > catch (MyException e) < System.err.println("Error!"); new MyException().MyException(); >catch (Exception e) < // Блок обработки всех остальных исключений блока try. >finally < System.out.println("Итого: \nИмя игрушки: " + this.name + "\nРазмер игрушки: " + this.size + "\nНомер игрушки: " + this.number); >> public static void main(String[] args) < Toys car = new Toys(); try < car.setParam("Car", "Large"); // Какие-то действия над объектом car. car.setParam("Car", "Small"); // Вот это приведет к возникновению исключительной ситуации. >catch (Exception e) < // . >> >

Запомните важное правило: если необходимо, чтобы были отдельные обработчики исключения для базового класса и его производных, всегда в начале нужно помещать обработчик для производных классов. Если же сделать наоборот, то всегда будет выполняться обработчик для базового класса, так как он обрабатывает исключения своего типа и производных классов, а это противоречит желанию создать отдельный обработчик для производного класса.
Естественно, вы заметили, что мы создали класс-исключение как производный от класса Exception.

Подробнее создание классов-исключений мы рассмотрим позднее, а пока давайте рассмотрим использование стандартного класса ArithmeticException (листинг 5.2).

Листинг 5.2.
Пример использования стандартного класса ArithmeticException

class Program < public static void main(String[] args) < int a = 10; try < a = a / Integer.parseInt(args[0]); System.out.println("10 / " + args[0] + " = " + a); >catch (ArithmeticException e) < System.out.println("Error!"); >catch (ArrayIndexOutOfBoundsException e) < System.out.println("Выходза пределы массива"); // А если пользователь не ввел значения в коммандной строке? >finally < System.out.println("That\'s all. "); >> >

Классы-исключения в большинстве своем наследуются от производного класса Exception. Можно использовать явное (прямое) обращение к объекту исключений, чтобы вызвать необходимые действия. Напомним о классе из первого примера, который позволяет обрабатывать исключение.

class MyException extends Exception < public void MyException() < System.out.println ("Возникло исключение. "); >>

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

Если же нужно использовать несколько классов, лучше всего создать базовый класс — и тогда метод будет обрабатывать ошибки с помощью базового класса и всех его производных. Искусственно создать исключения можно с помощью оператора throw. Приведем пример использования класса MyException (листинг 5.3).

Листинг 5.3.
Пример использования класса MyException

class Toys < public static short numbers = 0; public static short newNumber() < return ++numbers; >public short number; public String name, size; public void setParam(String name, String size) < try < this.name = name; this.size = size; if (this.number != 0) < throw new MyException(); // Вызов метода создания объекта MyException >this.number = Toys.newNumber(); > catch (MyException e) < System.err.println("Error!"); new MyException().MyException(); >catch (Exception e) < // Блок обработки всех остальных исключений блока try. >finally < System.out.println("Итого: \nИмя игрушки: " + this.name + "\nРазмер игрушки: " + this.size + "\nНомер игрушки: " + this.number); >> >

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

Хотя в языке Java предусмотрен стандартный класс-исключение для ошибок при попытке деления на 0, сейчас мы создадим собственный класс-исключение, который будет обрабатывать подобные ошибки (листинг 5.4).

Листинг 5.4.
Создание класса для обработки ошибок

class MyDivByZero extends Exception < public void MyDivByZero() < System.out.println("Что такое? Вы решили делить на 0?"); >> class Arithmetic < public static double myDelete(double a, double b) throws MyDivByZero < double c; try < if (b == 0.0) < throw new MyDivByZero(); >c = a / b; > catch (MyDivByZero e) < c = 0.0; System.exit(0); >return c; > public static void main(String[] args) < try < System.out.println("5.1, разделить на 1.2 будет " + myDelete(5.1, 1.2)); System.out.println("3.6, разделить на 0 будет " + myDelete(3.6, 0)); System.out.println("7.8, разделить на 3.9 будет " + myDelete(7.8, 3.9)); >catch (MyDivByZero e) < // . >> >

В данном случае мы сами разделили на 0, и проблемы с обработкой исключения не возникло (это всего лишь ошибка программиста — он ее исправит). А вдруг необходимо попросить пользователя ввести число и он введет 0? Тогда-то и будет проблема.

Вам також може сподобатися

DayNight: настраиваем автоматическую смену темы в android в зависимости от времени суток

Дизайн android приложений 2 15 889

О том, как настроить DayNight тему в приложении андроид, которая устанавливает темную или светлую тему

Исследование Android Q: Location Permissions

Изменения версий Android 0 4 035
Перевод статьи о нововведениях версии мобильной операционной системы Android Q. В этой статье речь

Урок 1 Продвинутого курса по разработке приложения для Youtube. Создаем проект в Android Studio

Уроки по android разработке на Java 78 405

Приветствуем всех участников продвинутого курса по созданию приложения Youtube! Прежде всего хотим вас всех поблагодарить

Тесты к урокам StartAndroid (разработка под андроид)

Уроки по android разработке на Java 5 2 047
Вернуться к урокам 1-10. Перейти к урокам 11-20 [mlw_quizmaster quiz=1]

Уроки 81-90 по разработке андроид-приложений

Уроки по android разработке на Java 1 353

Продолжаем изучать Handler, рассматриваем способы выполнения кода в UI-потоке (Android UI thread), знакомимся и работаем

Урок 10. Основы JAVA. Исключения (Exception) и методы их обработки. Операторы try…catch

Исключениями или исключительными ситуациями (состояниями) называются ошибки, возникшие в программе во время её работы. В языке Java все исключения являются объектами и могут быть вызваны не только системой, но и создаваться самим разработчиком.

Исключения делятся на несколько классов, которые имеют общего предка — класс Throwable. Его потомками являются подклассы Exception и Error. Исключения (Exceptions) являются результатом проблем в программе, которые в принципе решаемы и предсказуемы. Например, произошло деление на ноль в целых числах.

Ошибки (Errors) представляют собой более серьёзные проблемы, которые, согласно спецификации Java, не следует пытаться обрабатывать в собственной программе, поскольку они связаны с проблемами уровня JVM. Например, исключения такого рода возникают, если закончилась память, доступная виртуальной машине.

В Java все исключения делятся на три типа: контролируемые исключения (checked) и неконтролируемые исключения (unchecked), к которым относятся ошибки (Errors) и исключения времени выполнения (RuntimeExceptions, потомок класса Exception).

Контролируемые исключения представляют собой ошибки, которые можно и нужно обрабатывать в программе, к этому типу относятся все потомки класса Exception (кроме RuntimeException).

Исключения в Java

Евгений Мыца

Исключения в Java

Android Developer в emCodio, Преподаватель Компьютерной школы Hillel.

  1. 1. Что такое исключение
  2. 2. Причини и типы исключений
  3. 3. Проверяемые исключения
  4. 4. Непроверяемые исключения
  5. 5. Классы ошибок и исключений
  6. 6. Обработка исключений

Исключение (исключительная ситуация) — проблема, возникающая при выполнении программы.

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

Евгений Мыца, Android Developer в emCodio и Преподаватель курсов по Java, рассказывает, что такое исключения и что с ними делать.

Некоторые причины:

  • Пользователь ввел неверные данные
  • Невозможно найти файл, который необходимо открыть
  • Сетевое соединение было потеряно во время сеанса связи
  • JVM не хватает памяти
Рекомендуем публикацию по теме

Publication thumb

  • Ошибки, которые возникают в JVM памяти читать 3 мин

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

  • Проверяемые исключения (Checked Exception)
  • Непроверяемые исключения (Unchecked Exception)
  • Ошибки (Errors)

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

Проверяемые исключения проверяются компилятором во время компиляции. Также их называют исключением времени компиляции. Нельзя просто игнорировать их, программист должен позаботиться об этих исключениях (обработать).

К примеру, используем класс FileReader для чтения данных из файла. Файл, указанный в его конструкторе, отсутствует. Возникает исключение FileNotFoundException. Компилятор предлагает обработать исключение.

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

Непроверяемые исключения возникают при выполнении программы. Также называются исключениями времени исполнения (Runtime Exceptions). К ним относятся ошибки программирования, такие как логические ошибки или неправильное использование API. Исключения времени выполнения игнорируются во время компиляции.

Например, объявлен массив размером из 7 элементов. Пытаемся вызвать 8-й элемент массива. Возникает исключение ArrayIndexOutOfBoundsException.

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

К примеру, такие как OutOfMemoryError, VirtualMachineError, IOError.

Классы ошибок и исключений

Класс Throwable — суперкласс всех ошибок и исключений в Java.

Только объекты, являющиеся экземплярами этого класса (или одного из его подклассов), генерируются виртуальной машиной Java или могут быть выброшены оператором throw Java.

Экземпляры двух подклассов класса Throwable, Error и Exception обычно используются для обозначения возникновения исключительных ситуаций.

Exception — большинство исключений, генерирующих объекты в коде программы.

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

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

RuntimeException зарезервирован для исключений, указывающих на неправильное использование API.

Примером исключения времени выполнения является исключение NullPointerException, возникающее, когда метод пытается получить доступ к члену объекта через ссылку null.

Обработка исключений

Обработка исключений — процесс определения последовательности шагов в программе обработки исключения.

Предоставляя обработчики исключений в программе, мы можем обеспечить нормальное выполнение программы.

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

Варианты обработки исключений:

  • Перехват и обработка исключений
  • Указание исключений, создаваемых методом

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

Блок catch используется для обработки исключений.

Блок finally используется для выполнения требуемого программного кода. Выполняется независимо от того, обработано ли исключение.

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

Ключевое слово throws используется для объявления исключений. Указывает, что в способе может появиться исключение. Не вызывает исключение. Всегда используется с сигнатурой метода.

Рекомендуем курс по теме

Евгений Мыца

Android Developer в emCodio, Преподаватель Компьютерной школы Hillel.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *