2. Рассматриваемые вопросы
Актуальностьобработки ошибок
Причины возникновения ошибок и их
классификация
Понятие исключительной ситуации
Старый и новый подходы к обработке
ошибок
Механизм обработки исключений в
Java
Типы исключений. Иерархия их классов.
3. Пример потенциально
опасного кода программы
int a = Integer.parseInt(jTextField1.getText());
int b = Integer.parseInt(jTextField2.getText());
Int c = a / b;
Какие ошибки могут возникнуть в этой
программе?
Что произойдѐт при возникновении
ошибки?
Как можно сделать программу более
надѐжной?
4. Текущая ситуация
При выполнении программы иногда
могут возникать ошибки
Причины:
Ошибки программиста
Внешние причины
ошибка ввода/вывода при работе с
файлом или сетевым соединением
Сбой при работе с БД
И т.п.
5. Причины ошибок
Невнимательность (ошибки)
программиста:
отсутствует нужный класс, или индекс
массива вышел за допустимые границы
и т.п.
Независящие от программиста
причины:
произошел разрыв сетевого
соединения, сбой аппаратного
обеспечения, например, жесткого
диска, и др.
6. Предпосылки
Профессионально написанная
программа должна сохранять
работоспособность во всевозможных
ситуациях
Для этого нужно предусмотреть в
программе механизмы обработки ошибок
Самый очевидный, но не самый простой
способ – проверка условий с помощью
оператора if
7. Решения в старом стиле
В классических языках
программирования, например в С,
требовалось проверять некое условие,
которое указывало на наличие
ошибки и, в зависимости от этого
предпринимать определенные
действия
…
int statusCode = someAction();
if (statusCode){
… обработка ошибки
} else{
statusCode = anotherAction();
if(statusCode){
… обработка ошибки …
}
}…
8. Пример
Int a, b, c;
if (является ли строка1 числом)
a = Integer.parseInt(jTextField1.getText());
if (является ли строка2 числом)
b = Integer.parseInt(jTextField2.getText());
if (b != 0)
c = a / b;
9. Решение в стиле Java
В Java появилось более простое и
элегантное решение - обработка
исключительных ситуаций
try{
someAction();
anotherAction()
}catch(Exception e){
… обработка исключительной ситуации
}
такойподход является также более
надежным и простым для понимания
10. Причины возникновения
ошибок
Существует три причины возникновения
исключительных ситуаций:
Попытка выполнить некорректное
выражение
Выполнение оператора throw (выброс
исключения)
Асинхронные ошибки во время
исполнения программы
11. Попытка выполнить
некорректное выражение
Например:
деление на ноль,
обращение к объекту по ссылке, равной
null
попытка использовать класс, описание
которого (class-файл) отсутствует, и т.д.
В таких случаях всегда можно точно
указать, в каком месте произошла
ошибка - именно в некорректном
выражении
12. Выполнение оператора
throw
Throw – оператор выброса исключения
Очевидно, что и здесь можно легко
указать место возникновения
исключительной ситуации
13. Асинхронные ошибки во
время исполнения
программы
Причиной таких ошибок могут быть сбои
внутри самой виртуальной машины (ведь она
также является программой), или вызов
метода stop() у потока выполнения thread)
В этом случае невозможно указать точное
место программы, где происходит
исключительная ситуация. Если мы
пытаемся остановить поток выполнения
(вызвав метод stop()), то мы не можем
предсказать, при выполнении какого именно
выражения этот поток остановится
14. Виды ошибок
Синхронные
Асинхронные
Первыесравнительно проще, так как
принципиально возможно найти
точное место в коде, которое является
причиной возникновения
исключительной ситуации
15. Передача управления в
исключительной ситуации
При возникновении исключительной
ситуации управление передается от
кода, вызвавшего исключительную
ситуацию, на ближайший блок catch
(или вверх по стеку), и создается объект,
унаследованный от класса Throwable или
его потомков, который содержит
информацию об исключительной
ситуации и используется при ее
обработке.
Собственно в блоке catch указывается
именно класс обрабатываемой ситуации
16. Иерархия передачи
информации об исключении
Зависит от места возникновения
исключения. Если это:
метод, то управление будет
передаваться в то место, где этот метод
был вызван
конструктор, то управление будет
передаваться туда, где попытались
создать объект (как правило, применяя
оператор new);
17. Обработка исключений
try {
потенциально_опаные_операторы();
} catch (ТипИсключения1 переменная1) {
код по обработке исключения типа 1
} catch (ТипИсключения2 переменная2) {
код по обработке исключения типа 2
} finally {
операторы, кот. будут всегда (и в случае нормальной
работы, и в случае возникновения исключений)
}
18. Пример
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(“Ошибка преобразования из строки в
число”);
}
19. Описание обработки
Сначала выполняется код заключенный
в фигурные скобки оператора try.
Если во время его выполнения не
происходит никаких нештатных
ситуаций, то далее управление
передается, за закрывающую
фигурную скобку последнего
оператор catch, ассоциированного с
данным оператором try или блоку
finnaly, если он присутствует
20. Описание обработки
Если возникла исключительная ситуация,
класс которой указан в качестве параметра
одного из блоков catch.
В этом случае производится выполнение
блока кода ассоциированного с этим catch
(заключенного в фигурные скобки).
Далее если код в этом блоке завершается
нормально, то и весть оператор try
завершается нормально и управление
передается на оператор (выражение)
следующий за закрывающей фигурной
скобкой последнего catch ассоциированного
с данным try.
Если код в catch завершается нештатно, то и
весь try завершается нештатно по той же
причине
21. Описание обработки
есливозникла исключительная
ситуация, которая класс которой не
указан в качестве аргумента, ни в
одном catch, то выполнение всего try
завершается нештатно
22. Принцип обработки
Если в последовательности операторов
могут возникнуть как ошибки
ввода/вывода так и ошибки
арифметических вычислений, вовсе нет
нужды помещать различные
фрагменты кода в разные операторы
try{}catch(){}.
Достаточно обеспечить несколько
catch() для различных типов
исключений
23. Принципы обработки
Вкаком месте программы обрабатывать
исключения?
Если есть возможность написать код, который
может устранить причину исключения так, чтобы
программа могла продолжить нормальную
работу, следует написать этот код в
соответствующем блоке catch
В обработчике одного исключения (в блоке catch)
можно выбросить другое исключение с помощью
оператора throw:
catch (SQLException e) {
…
throw new LoginException( e );
}
25. Обрабатываемые и
необрабатываемые исключения
Все исключения делятся на 2 категории:
Обрабатываемые (проверяемые)
(checked)
Необрабатываемые (непроверяемые)
(unchecked)
Исключения, порожденные от
java.lang.RunTimeException, являются
необрабатываемыми, и компилятор не
требует обязательной их обработки
26. Обрабатываемые искл.
Все исключения, порожденные от
java.lang.Exception являются
обрабатываемыми. Т.е. во время компиляции
проверяется - предусмотрена ли обработка
возможных исключительных ситуаций
Как правило, обрабатываемые исключения
предназначены для обработки ситуаций
связанных с окружением программы
(сетевым, файловым вводом-выводом и др.),
которые могут возникнуть вне зависимости от
того, корректно написан код или нет.
Например, открытие сетевого соединения или
файла может привести к возникновению
ошибки, и компилятор требует от
программиста предусмотреть некие
действия для обработки возможных проблем.
27. Необрабатываемые искл.
Необрабатываемые исключения, это
ошибки программы, которые при
правильном кодировании возникать не
должны (например,
java.lang.IndexOfBoundException,
java.lang.ArifmeticException возникают
соответственно при указании индекса
выходящего за границы массива и при
делении на ноль).
Поэтому, чтобы не загромождать
программу, компилятор разрешает не
обрабатывать с помощью блоков try{}
catch() исключения этого типа
28. Ошибки (error)
Исключения,порожденные от Error, так
же не являются обрабатываемыми.
Эти ошибки предназначены для того
что бы уведомить программу о
возникновении сбоев которые
программным способом устранить
сложно, или невозможно вообще. В
качестве примера можно привести
StackOverflowError, OutOfMemoryError
30. Создание собственных
классов исключений
public class ServerTimedOutException extends Exception {
private int port;
public ServerTimedOutException( String message, int
port) {
super( message );
this.port = port;
}
public int getPort() {
return port;
}
}
31. Д/З
Изучить презентацию
Изучить доп.материал (лекция № 15 курса
Программирование на Java)
запустить демо-программу
добавить в неѐ работу с массивом, кот.
вызывает выход за его границу (например, в
методе создаѐтся массив из 10 элементов,
а пользователь должен ввести № элемента,
значение кот. он хочет увидеть на экране).
Использовать ArrayOutOfBoundException