Исключительные ситуации в

advertisement
Исключительные ситуации в
Java и обработка событий
Обработка ошибок
Назначение механизма обработки
исключительных ситуаций – передача
данных из того места кода, где возник сбой,
обработчику ошибок, который может
справиться с ними.
 При возникновении ошибок программа
должна сделать одно из двух:



вернуться в безопасное состояние и позволить
пользователю выполнить другие команды;
дать пользователю возможность сохранить
результаты своей работы и аккуратно
завершить программу.
Наиболее “популярные” виды
ошибок
Ошибки ввода (неправильный адрес
сайта)
 Сбои оборудования (принтер отключен,
сайт недоступен)
 Физические ограничения (переполнен
диск, исчерпана память)
 Ошибки программирования (неверная
работа методов)
При возникновении ошибки возбуждается
объект, инкапсулирующий информацию об
ошибке.

Иерархия наследования
исключительных ситуаций
Throwable
Error
…
Exception
IOException
Runtime
Exception
…
Error – внутренние ошибки, связанные с исчерпанием ресурсов.
Возбудить объект подобного типа программист не может!
 Exception – основная иерархия ошибок, которой следует уделять
внимание.

Иерархия Exception

Исключительные ситуации RuntimeException возникают
вследствие ошибок программирования. Все другие
исключительные ситуации – стечение обстоятельств.
RuntimeException
другие
Правило:
Неверное
приведениеситуация
типов RuntimeException, то это Ваша
есливозникла
исключительная
вина!
 Выход за допустимые пределы массива
Попытка
обратиться
к объекту
ссылке null –
Все ошибки,
производные
от класса
Error по
и RuntimeError,
неконтролируемые,
все 
остальные
– контролируемые.
Обрыв файла


Попытка соединиться с неправильным URL
Попытка обнаружить несуществующий объект класса Class
Объявление исключительных
ситуаций, возбуждаемых методом

Идея – метод предсказывает, какие ошибки могут возникнуть.
class MyAnimation{
public Image loadImage(String s) throws IOException,
MalformedURLException{
…
}
}

Неконтролируемые исключительные ситуации от классов
Error и RuntimeException объявлять не нужно. Пример
class MyAnimation{
void drawImage(int i) throws ArrayIndexOutOfBoundsException{
…
}
}
Возбуждение исключительных
ситуаций

Пример. Метод ReadData считывает из файла размером 1024
символа, однако чтение прервалось после 733 символа.
String ReadData (BufferReader in)
throws EOFException{
…
while(…)
{ if (ch == 1) //обнаружен конец файла
{ if (n < len )
EOFException e=new EOFException();
throw e;
}
…
} return s;
}
Если существует подходящий
класс исключений:
• Найти подходящий класс
исключений.
2. Создать объект этого
класса.
3. Возбудить его.
Создание классов
исключительных ситуаций

Если в программе возникает ситуация, не предусмотренная
ни одним из существующих классов исключения, достаточно
создать свой собственный класс от Exception или его
потомков (IOException).
class FileFormatException extend IOException{
public FileFormatException (){} //конструктор по умолчанию
Что(String
дальше?
public FileFormatException
g){ //”подробный” конструктор
super(g);}
}
…
String ReadData (BufferReader in) throws FileFormatException{
while(…)
{ if (ch == 1) //обнаружен конец файла
{ if (n < len ) throw new FileFormatException();}
…}
return s; }
Перехват исключительных
ситуаций (try/catch)
public void read (BufferReader reader){  Если оператор в секции try
try{
вызвал исключение, то
boolean done=false;
программа пропускает
while(!done)
оставшиеся операторы и
{ String line=reader.readLine();
переходит в секцию catch.
if (line == null) // конец файла
done = true;
 Стандартный метод
else
readLine() может возбуждать
{Обработка строки line;} }
исключение IOException.
}
 Если в секции catch нет
catch (IOException exception){
обработчика для такого
exception.printStackTrace();}
исключения, то метод
}
останавливает работу.
Распространение
исключительных ситуаций

Если в методе readLine() возникла ошибка, то можно
переложить обработку на вызывающий метод. Для этого
достаточно указать, что метод readLine() может возбуждать
исключительную ситуацию IOException.
public void read (BufferReader reader) throws IOException{
boolean done=false;
while(!done)
{ String line=reader.readLine();
if (line == null) // конец файла
done = true;
else
{Обработка строки line;} }
}
Перехват нескольких исключений

try {…}
catch (MalformedURLException e1){
…}
catch (UnknownHostException e2){
…}
catch (IOException e3){
…}

Объекты (e1, e2, e3)
исключительных
ситуаций могут
содержать информацию
о ней - e3.getMessage();
Тип объекта можно
определить
e3.getClass().getName()
.
Повторное возбуждение
исключительной ситуации

Иногда нужно перехватить исключение, сделать некоторые
действия и отправить исключение на дальнейшую обработку
в вызывающий метод:
Graphics g = image.getGraphics();
try{ код, который может вызвать исключение;}
catch(MalformedURLException e){
g.dispose();
throw e;}

Обработка исключения и передача нового:
Graphics g = image.getGraphics();
try{ код, который может вызвать исключение;}
catch(MalformedURLException e){
g.dispose();
throw new Exception(“My new exception”);}
Раздел finally
Graphics g = image.getGraphics();
try{ код, который может вызвать исключение;}
catch(IOException e){}
finally{
g.dispose();}
Graphics g = image.getGraphics();
try{ код, который может вызвать исключение;}
finally{
g.dispose();}
Обработка событий
Модель событий


Любой графический компонент может инициировать событие.
Каждое отдельное событие представлено определенным
классом. Когда событие инициируется, оно принимается
одним или несколькими слушателями Listener, которые его
обрабатывают. Таким образом, источник события и место его
обработки могут быть разнесены.
Слушатель каждого события – объект класса, реализующий
определенный вид интерфейса, характерного для всех
слушателей этого события. Необходимо создать объектслушатель и зарегистрировать его в компоненте, который
порождает событие. Слушатель – объект, заинтересованный
в получении события.
Модель событий




В объекте, который порождает событие, содержится список
слушателей, заинтересованных в получении уведомления,
что событие произошло. Источник оповещает слушателя
путем вызова спецметода и передачи события EventObject.
Регистрация события происходит с помощью метода
addXXXListener, принадлежащего компоненту, вызвавшему
событие, где XXX – тип обрабатываемого события
Метод getSource() класса event возвращает объект,
вызвавший событие
Удаление слушателя производится методом
removeXXXListener
Модель событий

В интерфейсе слушателя может определятся несколько
методов, например для MouseEvent. Если какой-либо класс
реализовывает интерфейс, то он обязан реализовать все
его методы. Это не удобно, если нас интересует всего один
из нескольких. Для этого для каждого интерфейса
слушателя, содержащего несколько методов, определен
простой класс адаптер, в котором эти методы пустые. Если
необходимо, то их можно переопределять.
Public class windowclosing extends WindowAdapter{
public void windowClosing(WindowEvent e){
………..}
}
Пример
public class Button2 extends JApplet {
private JButton b1 = new JButton("Button 1");
class ButtonListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
String name = ((JButton)e.getSource()).getText();
txt.setText(name); }
}
private ButtonListener blistener = new ButtonListener();
public void init() {
b1.addActionListener(blistener);
......}
}
Пример
Можно не описывать как в предыдущем примере класс,
реализующий интерфейс, а затем создавать его экземпляр.
Следующий пример реализует те же действия, но более
коротким путем.
private ActionListener bl = new ActionListener() {
public void actionPerformed(ActionEvent e) {
String name = ((JButton)e.getSource()).getText();
txt.setText(name);
}
Некоторые важные интерфейсы

MouseMotionListener и MouseMotionEvent:



mouseMoved()
mouseDragged()
MouseListener и MouseEvent:




mousePressed()
mouseReleased()
mouseClicked()
Методы события getX() и getY() возвращают координаты
Некоторые важные интерфейсы

KeyListener и KeyEvent:




keyTyped()
keyPressed()
keyReleased()
Метод события KeyEvent getKeyChar() возвращает символ
Download