Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых
[Назад]

Библиотека примеров приложений Java

Оглавление
Базовые типы

Замещающие типы
Без указателей
Массивы
Структурное программи-
рование

Обработка исключений
Возбуждение исключений
Классы обработки исключений
Блок finally
Строки String
Класс Math
Класс Vector
Класс Stack
Словарь на базе Hashtable
Словарь на базе Properties
Цифровые часы
Собственный класс
Наследование классов

Интерфейсы

Назад Вперед

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

Назад Вперед

[Назад]