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

Preview:

Citation preview

Обработка исключений в JavaОбработка ошибок, создание надёжных программ

www.spro-club.ru

Рассматриваемые вопросы Актуальность обработки ошибок Причины возникновения ошибок и их

классификация Понятие исключительной ситуации Старый и новый подходы к обработке

ошибок Механизм обработки исключений в

Java Типы исключений. Иерархия их

классов.

Пример потенциально опасного кода программы

Какие ошибки могут возникнуть в этой программе?

Что произойдёт при возникновении ошибки?

Как можно сделать программу более надёжной?

int a = Integer.parseInt(jTextField1.getText());int b = Integer.parseInt(jTextField2.getText());Int c = a / b;

Текущая ситуация При выполнении программы иногда

могут возникать ошибкиПричины: Ошибки программиста Внешние причины

ошибка ввода/вывода при работе с файлом или сетевым соединением

Сбой при работе с БД И т.п.

Причины ошибок Невнимательность (ошибки)

программиста: отсутствует нужный класс, или индекс

массива вышел за допустимые границы и т.п.

Независящие от программиста причины: произошел разрыв сетевого

соединения, сбой аппаратного обеспечения, например, жесткого диска, и др.

Предпосылки Профессионально написанная

программа должна сохранять работоспособность во всевозможных ситуациях

Для этого нужно предусмотреть в программе механизмы обработки ошибок

Самый очевидный, но не самый простой способ – проверка условий с помощью оператора if

Решения в старом стиле В классических языках

программирования, например в С, требовалось проверять некое условие, которое указывало на наличие ошибки и, в зависимости от этого предпринимать определенные действия

…int statusCode = someAction();if (statusCode){ … обработка ошибки} else{ statusCode = anotherAction(); if(statusCode){ … обработка ошибки … }}…

ПримерInt a, b, c;

if (является ли строка1 числом)

a = Integer.parseInt(jTextField1.getText());

if (является ли строка2 числом)

b = Integer.parseInt(jTextField2.getText());

if (b != 0)

c = a / b;

Решение в стиле Java В Java появилось более простое и

элегантное решение - обработка исключительных ситуаций

такой подход является также более надежным и простым для понимания

try{ someAction(); anotherAction()}catch(Exception e){ … обработка исключительной ситуации}

Причины возникновения ошибокСуществует три причины возникновения исключительных ситуаций: Попытка выполнить некорректное

выражение Выполнение оператора throw (выброс

исключения) Асинхронные ошибки во время

исполнения программы

Попытка выполнить некорректное выражение Например:

деление на ноль, обращение к объекту по ссылке,

равной null попытка использовать класс, описание

которого (class-файл) отсутствует, и т.д.

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

Выполнение оператора throw Throw – оператор выброса

исключения Очевидно, что и здесь можно

легко указать место возникновения исключительной ситуации

Асинхронные ошибки во время исполнения программы Причиной таких ошибок могут быть сбои

внутри самой виртуальной машины (ведь она также является программой), или вызов метода stop() у потока выполнения thread)

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

Виды ошибок Синхронные Асинхронные

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

Передача управления в исключительной ситуации При возникновении исключительной

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

Собственно в блоке catch указывается именно класс обрабатываемой ситуации

Иерархия передачи информации об исключенииЗависит от места возникновения исключения. Если это: метод, то управление будет

передаваться в то место, где этот метод был вызван

конструктор, то управление будет передаваться туда, где попытались создать объект (как правило, применяя оператор new);

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

потенциально_опаные_операторы();

} catch (ТипИсключения1 переменная1) {

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

} catch (ТипИсключения2 переменная2) {

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

} finally {

операторы, кот. будут всегда (и в случае нормальной

работы, и в случае возникновения исключений)

}

Пример

int a, b, c;

try {

a = Integer.parseInt(jTextField1.getText());

b = Integer.parseInt(jTextField2.getText());

c = a / b;

} catch (ArithmeticException e) {

System.out.println(“Попытка деления на 0”);

} catch (NumberFormatException e) {

System.out.println(“Ошибка преобразования из строки в

число”);

}

Описание обработки Сначала выполняется код

заключенный в фигурные скобки оператора try.

Если во время его выполнения не происходит никаких нештатных ситуаций, то далее управление передается, за закрывающую фигурную скобку последнего оператор catch, ассоциированного с данным оператором try или блоку finnaly, если он присутствует

Описание обработки Если возникла исключительная ситуация,

класс которой указан в качестве параметра одного из блоков catch.

В этом случае производится выполнение блока кода ассоциированного с этим catch (заключенного в фигурные скобки).

Далее если код в этом блоке завершается нормально, то и весть оператор try завершается нормально и управление передается на оператор (выражение) следующий за закрывающей фигурной скобкой последнего catch ассоциированного с данным try.

Если код в catch завершается нештатно, то и весь try завершается нештатно по той же причине

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

ситуация, которая класс которой не указан в качестве аргумента, ни в одном catch, то выполнение всего try завершается нештатно

Принцип обработки Если в последовательности

операторов могут возникнуть как ошибки ввода/вывода так и ошибки арифметических вычислений, вовсе нет нужды помещать различные фрагменты кода в разные операторы try{}catch(){}.

Достаточно обеспечить несколько catch() для различных типов исключений

Принципы обработки В каком месте программы обрабатывать

исключения? Если есть возможность написать код, который

может устранить причину исключения так, чтобы программа могла продолжить нормальную работу, следует написать этот код в соответствующем блоке catch

В обработчике одного исключения (в блоке catch) можно выбросить другое исключение с помощью оператора throw:

catch (SQLException e) {…throw new LoginException( e );}

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

Обрабатываемые и необрабатываемые исключения

Все исключения делятся на 2 категории: Обрабатываемые (проверяемые)

(checked) Необрабатываемые (непроверяемые)

(unchecked)

Исключения, порожденные от java.lang.RunTimeException, являются необрабатываемыми, и компилятор не требует обязательной их обработки

Обрабатываемые искл. Все исключения, порожденные от

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

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

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

Необрабатываемые искл. Необрабатываемые исключения, это

ошибки программы, которые при правильном кодировании возникать не должны (например, java.lang.IndexOfBoundException, java.lang.ArifmeticException возникают соответственно при указании индекса выходящего за границы массива и при делении на ноль).

Поэтому, чтобы не загромождать программу, компилятор разрешает не обрабатывать с помощью блоков try{} catch() исключения этого типа

Ошибки (error) Исключения, порожденные от Error,

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

Оператор throw

Создание собственных классов исключений

public class ServerTimedOutException extends Exception { private int port; public ServerTimedOutException( String message, int port) { super( message ); this.port = port; } public int getPort() { return port; } }

Д/З Изучить презентацию Изучить доп.материал (лекция № 15 курса

Программирование на Java) запустить демо-программу добавить в неё работу с массивом, кот.

вызывает выход за его границу (например, в методе создаётся массив из 10 элементов, а пользователь должен ввести № элемента, значение кот. он хочет увидеть на экране). Использовать ArrayOutOfBoundException

Recommended