Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры 1сем.doc
Скачиваний:
1
Добавлен:
22.12.2018
Размер:
411.14 Кб
Скачать

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

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

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

Существует три причины возникновения исключительных ситуаций в Java-программе.

1.Попытка выполнить некорректное выражение.

Например, деление на ноль, или обращение к объекту по ссылке, равной null,

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

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

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

3.Асинхронные ошибки во время исполнения программы.

В Java обработка исключительных ситуаций (exception handling) происходит следующим образом:

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

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

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

try – throw – catch

try – catch

try – catch –finally или try – finally

Если исключение не генерируется, то catch блоки игнорируются.

общая форма блока обработки исключений.

try {

…. // блок кода }

[throw(e)] // возбуждение исключения

catch (КлассИсключения1 е) {

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

// КлассИсключения1 }

catch (КлассИсключения2 е) {

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

//КлассИсключения2

[throw(e)] // повторное возбуждение

//исключения }

[finally { }]

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

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

--Если в пределах try возникает исключительная ситуация, то далее выполнение кода производится по одному из перечисленных ниже сценариев.

1.производится выполнение блока кода, ассоциированного с данным catch

2. если код в этом блоке завершается нормально, то и весь оператор try завершается нормально

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

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

--Оператор finally предназначен для того, чтобы обеспечить гарантированное выполнение какого-либо фрагмента кода, вне зависимости от того, возникла ли исключительная ситуация

если блок finally завершается ненормально, то весь try завершится ненормально по той же причине.

--Программист сам может явно сгенерировать ошибку с помощью оператора throw.

public int calculate (int theValue)

throws Exception {

if (theValue < 0) {

throw new Exception ("Some

descriptive info");} }

--В вершине иерархии исключений стоит класс Throwable.

Каждый из типов исключений является подклассом класса Throwable

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

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

Объекты-исключения автоматически создаются исполняющей средой Java в результате возникновения определенных исключительных состояний

Example 1

class Exc0 {

public static void main(string args[]) {

int d = 0;

int a = 42 / d; } }

С:\> java Exc0 java.lang.ArithmeticException: / by zero at Exc0.main(Exc0.java:4)

Example 2

class Exc2 {

public static void main(String args[]) {

try {

int d = 0;

int a = 42 / d; }

catch (ArithmeticException e) { System.out.println("division by zero"); } }}

Example 3

class MultiCatch {

public static void main(String args[]) {

try {

int a = args.length;

System.out.println("a = " + a);

int b = 42 / a;

int c[] = { 1 };

c[42] = 99; }

catch (ArithmeticException e) {

System.out.println("div by 0: " +

e.getMessage()); }

catch(ArrayIndexOutOfBoundsException e) { System.out.println("array index c:"+

e.getMessage()); } } }

1. С:\> java MultiCatch

а = 0

div by 0: java.lang.ArithmeticException: / by zero

2.C:\> java MultiCatch 1

a = 1

array index c: java.lang.ArrayIndexOutOfBoundsException: 42

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

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

Исключения генерируются по одной из 3 причин:

1.Виртуальной машиной языка Ява было обнаружено ошибочное состояние

--формула оценки выражения нарушает нормальную семантику языка Ява

--ошибка происходит при загрузке или компоновке части Ява-программы

--некий ограниченный ресурс превышен

2.Оператор throw был выполнен в Ява- коде.

3.В виртуальной машине произошла внутренняя ошибка

Исключения представлены экземплярами класса Throwable и его подклассов.

Все вместе эти классы- классы исключений – делятся на 2 типа

1.Классы проверяемых исключений

2.Классы непроверяемых исключений

Во время компиляции язык Ява проверяет то, что Ява- программа содержит обработчики для проверяемых исключений

Классы непроверяемых исключений - это класс RuntimeException и его подклассы, а также класс Error и его подклассы

Все оставшиеся классы исключений - классы проверяемых исключений (обязательно нужно перехватывать).

Класс RuntimeException:

--ArithmeticException

--ArrayStoreException

--ClassCastException

--IllegalArgumentException

NumberFormatException

--IndexOutOfBoundsException

--NegativeArraySizeException

--NullPointerException

Стандартные проверяемые исключения:

( для Exception кроме Runtime)

--ClassNotFoundException

--IllegalAccessException

--InstantiationException:

Пакет java.io определяет следующие дополнительные стандартные исключения: . IOException

--EOFException

--FileNotFoundException

Класс Error

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

Если возникла исключительная ситуация типа Error, то возможность продолжения работы программы сомнительна — нужно прекращать работу программы и, возможно, переинсталлировать Java.

Перехватывать исключения типа Error не нужно.

Класс Error :

--ошибки загрузки, компоновки, подготовки, контроля или инициализации (экземпляры подкласса LinkageError)

--ошибки виртуальной машины:

генерирует объект, который является экземпляром подкласса класса VirtualMachineError

Ошибки

--InternalError

--OutOfMemoryError

--StackOverflowError

--UnknownError

Методы класса Throwable

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

--public String toString() -

Краткое сообщение о исключении.

--public String getMessage() -

Полное сообщение о исключении.

--public void printStackTrace()

--public void printStackTrace(PrintStream s)

--public void printStackTrace(PrintWriter s)

Выдача в стандартный или указанный поток полной информации о точке возникновения исключения.

Метод getMessage

Каждое исключение имеет переменную реализации типа string, которая содержит некоторое сообщение,

обычно идентифицирующее причину исключения

throw new Exception(“message”);

message -аргумент конструктора Exception

Если объект называется е, то вызов метода е.getMessage () возвращает эту строку

try{ ….

if (a<0)

throw new Exception("Вводимые значения должны быть положительными.");}

catch(Exception e) {

System.out.println(e.getMessage());

System.out.println("Аварийное завершение программы.")

System.exit(0); }

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

Общая структура:

public class MyException extends

Exception {

public MyException() {};

public MyException(String msg) {

super(msg);} }

Пример

1.public class DivideByZeroException

extends Exception{

public DivideByZeroException () {

super ("Деление на нуль!"); }

public DivideByZeroException(String

message){

super(message);}}

2.public class DivideByZeroExceptionDemo{

private int numerator;

private int denominator;

private double quotient;

public static void main(String [] args){

DivideByZeroExceptionDemo oneTime =

new DivideByZeroExceptionDemo();

oneTime.doIt();

public void doIt() {

try{

System.out.println("Введите

числитель:");

numerator = System.in.readLinelnt();

System.out.println("Введите

знаменатель:") ;

denominator = System.in.readLinelnt();

if (denominator ==0)

throw new DivideByZeroException();

quotient = numerator/(double)

denominator;

System.out .println (numerator + "/"

+ denominator + " = " + quotient); }

catch(DivideByZeroException e) {

System.out.println(e.getMessage());

secondChance() ; }

System.out.println("Конец программы.");

}// end of doIt

3. public void secondChance() {

System.out.println("Попробуйте еще раз.");

System.out.println("Введите числитель:");

numerator = System.in.readLinelnt ();

System.out.println("Введите знаменатель:");

System.out.println("Позаботьтесь о том, чтобы знаменатель не был равен нулю.");

denominator = System.in.readLineInt()

if (denominator ==0){

System.out.println(

"Невозможно выполнить деление

на нуль.");

System.out.println( "Поскольку вы

хотите от меня невозможного,");

System.out.println("программа будет

завершена.");

System.exit(0); }

quotient = ( (double) numerator)/

denominator;

System.out.println (numerator + "/“ +

denominator + " = " + quotient); }

} // end of secondChance

Использование классов исключений

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

Это предупреждение называется

throws-директивой:

public void sample() throws DivideByZeroException

Т.е. вызов метода sample может сгенерировать исключение класса

DivideByZeroException

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

1.Исключение перехватывается в catch-блоке внутри определения метода

2.Обработка осуществляется внутри класса или метода , вызывающего данный метод (throws-директива необходима)

-Если метод генерирует исключение, и это исключение не перехватывается внутри метода, то выполнение метода будет завершено сразу после генерации исключения

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

(меньше можно)