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

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

Embed Size (px)

Citation preview

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

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

www.spro-club.ru

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

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

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

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

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

классов.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

if (b != 0)

c = a / b;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

} finally {

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

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

}

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

Пример

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(“Ошибка преобразования из строки в

число”);

}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

(unchecked)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Оператор throw

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

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

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

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

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

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

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