Каждый блок catch() перехватывает исключение только одного типа – того, который указан в его аргументе. Но можно написать несколько блоков catch() для перехвата нескольких типов исключений.
Если исключительных ситуаций не было, то операторы блока try выполняются в обычном порядке, после чего выполняются операторы программы, следующие за блоком catch () – блок перехвата не выполняется.
Если в блоке try возникла исключительная ситуация (ошибка), то выполнение этого блока прерывается, и идет перехват исключения в блоках catch().Если тип этого исключения соответствует типу, указанному в качестве параметра очередного блока catch(), то выполняются операторы этого блока перехвата, после чего проверки в следующих блоках catch () не выполняются.
Пример: определить значение переменной действительного типа и целого типа i=y/x, причем значение знаменателя ввести с помощью диалогового окна:
import java.io.*;
import javax.swing.*;
{
public static void main(String[] args) throws IOException
{
double x, y=5.0, z=0;
input=JOptionPane.showInputDialog("Введите значение знаменателя:");
{
x=Double.parseDouble(input); //преобразование типов
z=Math.sqrt(y/x); // извлечение квадратного корня
i=(int)y/(int)x; // целочисленное деление
System.out.println("x=" + x + " z=" + z + " i=" + i);
}
{ // перехват целочисленного деления на ноль
System.out.println("Ошибка: деление на ноль, " + eArithmetic);
}
{ // перехват ошибки преобразования
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. Правда, нужно указывать не все классы исключений, а только неконтролируемые. Исключение передается выше по иерархии методов, и, если обработка его ни в одном из методов не предусмотрена, то используется обработчик исключительной ситуации по умолчанию, что приводит к аварийному завершению работы программы.
Изменим предыдущую программу, вынеся деление в отдельный метод: