Назад
Вперед
1.6. Обработка исключений
В примере демонстрируются приемы обработки
исключений нескольких типов, возникающих в
приложениях Java.
Исходный текст примера
Архив проекта для Java WorkShop 2.0
Немного теории
Механизм исключений, предусмотренный в языке
программирования Java, упрощает обработку ошибок.
Вместо того чтобы проверять значение,
возвращаемое функциями и методами, вы можете
использовать для обнаружения и обработки ошибок
структурные операторы, такие как try и catch.
Методы стандартных библиотек классов Java
возбуждают исключения при возникновении
ошибочных ситуаций. Заключив "ненадежный" с
точки зрения возникновения ошибок код в блок try,
вы можете перехватить и обработать исключения в
блоке catch.
Заметим, что исключения возникают и в таких
распространенных ситуациях, как выход за пределы
массива или строки в процессе индексации,
деление на нуль, попытка использования ссылки со
значением null, недопустимое преобразование
классов и так далее. С помощью исключений все
подобные ошибки нетрудно обнаружить и
обработать во время выполнения приложения.
Описание примера
В нашем примере мы покажем типичные ситуации, в
которых возникают исключения.
Исключение ArrayIndexOutOfBoundsException
Это исключение возникает, когда программа
пытается адресовать элементы за пределами
массива.
В нашем примере мы используем исключение
ArrayIndexOutOfBoundsException для завершения цикла обработки
массива при достижении его границы:
int i = 0;
int[] nArray = new int[5];
while(true)
{
try
{
nArray[i] = i;
}
catch(Exception ex)
{
System.out.println("\n" + ex.toString());
break;
}
System.out.print(i);
i++;
}
Если не предусмотреть обработку исключения,
программа завершится аварийно. Как только
значение переменной i достигнет пяти, будет
вызван системный обработчик исключений.
Наш обработчик, заданный в теле оператора catch,
выводит название исключения на консоль, а затем
прерывает выполнение цикла при помощи оператора
break. Таким образом, программа продолжает свою
работу "штатным" образом несмотря на
предпринятую попытку выхода за границы массива.
Сообщение об исключении, отображенное
приведенным выше фрагментом кода на консоли,
выглядит следующим образом:
01234
java.lang.ArrayIndexOutOfBoundsException: 5
Исключение ArithmeticException
Ниже мы выполняем попытку деления числа 5 на
нуль:
i = 0;
try
{
i = 5/i;
}
catch(Exception ex)
{
System.out.println(ex.toString());
}
В результате такой попытки возникает
исключение ArithmeticException и наша программа выводит
на консоль соответствующее сообщение,
показанное ниже:
java.lang.ArithmeticException: / by zero
Исключение ArrayStoreException
Если попытаться записать в ячейку массива
ссылку на объект неправильного типа, возникнет
исключение ArrayStoreException.
Ниже мы создаем массив класса Object,
предназначенный для хранения строк класса String:
Object szStr[] = new String[10];
try
{
szStr[0] = new Character('*');
}
catch(Exception ex)
{
System.out.println(ex.toString());
}
При попытке записать в первый элемент этого
массива ссылку на объект класса Character возникает
исключение:
java.lang.ArrayStoreException
Исключение ClassCastException
В языке программирования Java вы не можете
выполнять явное преобразование типов
произвольным образом. Если выполнить такое
преобразование для классов, не связанных
"узами" наследования, или другим
недопустимым способом, возникнет исключение
ClassCastException.
Ниже мы создаем ссылку на объект класса Character,
а затем пытаемся выполнить преобразование этой
ссылки к типу Byte:
Object ch = new Character('*');
try
{
System.out.println((Byte)ch);
}
catch(Exception ex)
{
System.out.println(ex.toString());
}
В результате возникает исключение:
java.lang.ClassCastException:
java.lang.Character
Исключение NegativeArraySizeException
Это исключение возникает при попытке создать
массив отрицательного размера.
В приведенном ниже фрагменте кода мы создаем
массив с размером -5:
try
{
int[] nNegArray = new int[-5];
}
catch(Exception ex)
{
System.out.println(ex.toString());
}
При этом возникает исключение NegativeArraySizeException:
java.lang.NegativeArraySizeException
Исключение NullPointerException
Если попытаться использовать в программе
ссылку, содержащую значение null, возникнет
исключение NullPointerException.
Ниже мы создаем ссылку на массив nNulArray,
записываем в нее значение null, а затем пытаемся
определить размер массива, вызывая для этого
метод length:
int[] nNulArray = new int[5];
nNulArray = null;
try
{
i = nNulArray.length;
}
catch(Exception ex)
{
System.out.println(ex.toString());
}
В результате возникает исключение:
java.lang.NullPointerException
Исключение StringIndexOutOfBoundsException
В Java есть методы, позволяющие работать с
отдельными символами строк класса String. Например,
метод charAt позволяет извлечь символ,
расположенный в заданной позиции. Если указать
позицию, лежащую за границей строки, возникнет
исключение StringIndexOutOfBoundsException.
Ниже мы предпринимаем попытку извлечения
десятого символа из строки, в которой имеется
только три символа:
String szShortString = "123";
try
{
char chr = szShortString.charAt(10);
}
catch(Exception ex)
{
System.out.println(ex.toString());
}
При этом возникает исключение, а на экране
появляется сообщение следующего вида:
java.lang.StringIndexOutOfBoundsException:
String index out of range: 10
Назад Вперед |