Назад
Вперед
1.7. Возбуждение исключений
В примере демонстрируются приемы обработки
исключений нескольких типов, возникающих в
приложениях Java.
Исходный текст примера
Архив проекта для Java WorkShop 2.0
Немного теории
В приложении нетрудно определить собственный
класс для обработки исключений. Такой класс
должен быть унаследован от класса Exception с
использованием ключевого слова extends.
При возбуждении исключения ключевым словом throw
вы можете передать конструктору
соответствующего объекта произвольные
параметры. Эти параметры могут быть использованы
для передачи информации об условиях, вызвавших
появление исключения.
Применение собственного класса для обработки
исключений позволяет выполнить более тонкую
обработку ошибок по сравнению той, что может быть
организована с помощью стандартных классов,
созданных на базе класса Exception.
Описание примера
В нашем примере мы создали класс MyPoint,
предназначенный для хранения координат точки.
Эти координаты должны быть больше нуля. Если
программа пытается создать точку с
отрицательными координатами или установить
отрицательные координаты для существующей
точки, конструктор класса или метод setPoint
возбуждает исключение NegativePointCoordinateEx.
Класс NegativePointCoordinateEx, порожденный от класса
Exception, запоминает ошибочные координаты для их
последующего вывода на консоль.
Исходный текст основного класса throwDemo
представлен ниже:
public class throwDemo
{
public static void main(String args[])
{
try
{
MyPoint mp = new MyPoint(0, -1);
}
catch(NegativePointCoordinateEx e)
{
System.out.println("\n" + e.toString());
System.out.println("Point: ("
+ e.x + "," + e.y + ")");
}
System.out.println("\n" );
}
}
Здесь мы создаем объект класса MyPoint, намеренно
передавая конструктору отрицательную
координату по оси Y.
Обработчик возникающего в результате этой
операции исключения NegativePointCoordinateEx отображает на
консоли две строки. Первая строка создается
базовым классом Exception, а вторая формируется из
координат точки, вызвавших появление исключения:
NegativePointCoordinateEx:
Negative Point Coordinate: (0,-1)
Point: (0,-1)
Реализация класса MyPoint выглядит следующим
образом:
class MyPoint
{
private int m_x=0;
private int m_y=0;
MyPoint(int ix, int iy)
throws NegativePointCoordinateEx
{
if((ix == 0) | (iy == 0))
{
throw new NegativePointCoordinateEx(
ix, iy, this);
}
m_x = ix;
m_y = iy;
}
public void setPoint(int ix, int iy)
throws NegativePointCoordinateEx
{
if((ix == 0) | (iy == 0))
{
throw new NegativePointCoordinateEx(
ix, iy, this);
}
m_x = ix;
m_y = iy;
}
public void printPoint()
{
System.out.println("Point: ("
+ m_x + "," + m_y + ")");
}
}
Обратите внимание, что в прототипе
конструктора мы указали имя класса,
подготовленного нами для обработки исключений:
MyPoint(int ix, int iy)
throws NegativePointCoordinateEx
Аналогично мы поступили и при определении
метода setPoint, который тоже может возбуждать
исключение NegativePointCoordinateEx.
Исключение возбуждается следующим образом:
if((ix == 0) | (iy == 0))
{
throw new NegativePointCoordinateEx(
ix, iy, this);
}
Мы создаем объект класса NegativePointCoordinateEx,
передавая конструктору координаты точки, а также
ссылку на объект, в котором произошло исключение.
Исходный текст класса NegativePointCoordinateEx
представлен ниже:
class NegativePointCoordinateEx
extends Exception
{
public int x;
public int y;
NegativePointCoordinateEx(int ix, int iy,
Object obj)
{
super("Negative Point Coordinate: ("
+ ix + "," + iy + ")");
x = ix;
y = iy;
}
}
Прежде всего конструктор класса NegativePointCoordinateEx
вызывает конструктор родительского класса, то
есть класса Exception. Этому конструктору передается
текстовая строка описания ошибки. В строку мы
включили значения ошибочных координат.
Кроме того, ошибочные координаты мы записали и
в поля класса NegativePointCoordinateEx с именами x и y. В
дельнейшем блок обработки исключения catch сможет
их проанализировать.
Что же касается ссылки на объект, вызвавший
исключение, то в нашем примере он не
используется. Тем не менее, в более сложных
случаях вы сможете найти для него применение, так
как он предоставляет доступ ко всем полям и
методам объекта.
Назад Вперед |