Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по Java.doc
Скачиваний:
836
Добавлен:
04.06.2015
Размер:
5.55 Mб
Скачать

Обработка исключительных ситуаций

В любой программе, даже самой правильной, не имеющей синтаксических ошибок, могут возникнуть ошибки другого рода. Эти ошибки не связаны с синтаксисом программного кода, а связаны с алгоритмом выполнения программы: деление на ноль, выход за пределы массива, переполнение стека при рекурсии. Конечно, лучше отслеживать такие ошибки еще на стадии составления кода программы, то есть предусмотреть такие ситуации и застраховаться от них. Для этого можно использовать проверку выхода значений необходимых переменных за заданный диапазон:

If (переменная name вышла за диапазон)

{

действия программы в аварийной ситуации

}

На это уходит много времени, а сама программа превращается в набор таких проверок. Любая производственная программа, написанная на алгоритмических языках СилиPascal, состоит на2/3из них. Конечно, все случаи предусмотреть нельзя, поэтому рано или поздно какая-нибудь ошибочная ситуация приведет к аварийному завершению программы.

Внимание!Программа должна завершать работу, когда это нужно программисту, а не когда

она этого захочет!

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

Исключительная ситуация– этоошибка, которая возникает при выполнении программы.

Исключение– этообъект, который описывает исключительную ситуацию (ошибку).

При обработке ошибки используется бейсбольная терминология (ну как же, америкосы!). Говорят, что программа выбрасывает(throws) объект-исключение, если произошла исключительная ситуация. Этот объектпролетаетчерез всю программу, появившись сначала в том методе, где произошла ошибка. Программа в одном или нескольких местахпытается(try) егоперехватить(catch) и обработать. Для того, чтобы попытаться (try) перехватить объект-исключение, нужно весь код программы, в котором может возникнуть исключительная ситуация, охватить операторами:

try

{

проверяемый код программы

}

catch (тип исключения)

{

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

}

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

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

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

Пример: определить значение переменной действительного типаи целого типаi=y/x,причем значение знаменателя ввести с помощью диалогового окна:

package javaapplicationtry;

Import java.Io.*;

Import javax.Swing.*;

public class JavaApplicationTry

{

public static void main(String[] args) throws IOException

{

double x, y=5.0, z=0;

int i;

String input;

input=JOptionPane.showInputDialog("Введите значение знаменателя:");

try

{

x=Double.parseDouble(input); //преобразование типов

z=Math.sqrt(y/x); // извлечение квадратного корня

i=(int)y/(int)x; // целочисленное деление

System.out.println("x=" + x + " z=" + z + " i=" + i);

}

catch (ArithmeticException eArithmetic)

{ // перехват целочисленного деления на ноль

System.out.println("Ошибка: деление на ноль, " + eArithmetic);

}

catch (NumberFormatException eNumberFormat)

{ // перехват ошибки преобразования

System.out.println("Ошибка преобразования из строки в число, " + eNumberFormat);

}

System.out.println("В конце вызова z=" + z);

}

}

В этой программе eArithmeticобъект классаArithmeticException– арифметические ошибки,eNumberFormatобъект классаNumberFormatExceptionнекорректное преобразование строки в число.

При вводе корректногозначения знаменателя, например,x=2.0, на консоль будет выведено:

x=2.0 z=1.5811388300841898 i=2

В конце вызова z=1.5811388300841898

Введем отрицательноезначение знаменателя:x=-2.0:

x=-2.0 z=NaN i=-2

В конце вызова z=NaN

Таким образом, извлечение квадратного корня изотрицательногочисла вJavaразрешенои дает значениеNaN (исключительная ситуацияне возникает).

Введем нулевоезначение знаменателя:x=0.0:

Ошибка: деление на ноль, java.lang.ArithmeticException: / by zero

В конце вызова z=Infinity

Таким образом, деление на нольдействительныхчисел вJavaразрешенои дает значениеInfinity (исключительная ситуацияне возникает). При делении на нольцелыхчисел возникает исключительная ситуация, формируется объект-исключениеeArithmetic, который и перехватывается блокомcatch (ArithmeticException eArithmetic).

Введемнекорректноезначение знаменателя:x=0,0:

Ошибка преобразования из строки в число, java.lang.NumberFormatException: For input string: "0,0"

В конце вызова z=0.0

При этом формируется объект-исключение eNumberFormat, который перехватывается блокомcatch (NumberFormatException eNumberFormat).

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

System.out.println("В конце вызова z=" + z);

Может случиться, что в блоке try возникла ошибка, но подходящего блокаcatchдля ее обработки нет. В этом случае исключениевыбрасываетсяиз метода и передается внешнему (вызывающему его) методу. Согласно правилам языкаJava, исключения, которые не обрабатываются в методе и выбрасываются из него, указываются в заголовке метода после ключевого словаthrows. Правда, нужно указывать не все классы исключений, а тольконеконтролируемые. Исключение передается выше по иерархии методов, и, если обработка его ни в одном из методов не предусмотрена, то используется обработчик исключительной ситуациипо умолчанию, что приводит к аварийному завершению работы программы.

Изменим предыдущую программу, вынеся деление в отдельный метод:

package javaapplicationtry;