Transcript Исключительные ситуации в
Slide 1
Исключительные ситуации в
Java и обработка событий
Slide 2
Обработка ошибок
Назначение механизма обработки
исключительных ситуаций – передача
данных из того места кода, где возник сбой,
обработчику ошибок, который может
справиться с ними.
При возникновении ошибок программа
должна сделать одно из двух:
вернуться в безопасное состояние и позволить
пользователю выполнить другие команды;
дать пользователю возможность сохранить
результаты своей работы и аккуратно
завершить программу.
Slide 3
Наиболее “популярные” виды
ошибок
Ошибки ввода (неправильный адрес
сайта)
Сбои оборудования (принтер отключен,
сайт недоступен)
Физические ограничения (переполнен
диск, исчерпана память)
Ошибки программирования (неверная
работа методов)
При возникновении ошибки возбуждается
объект, инкапсулирующий информацию об
ошибке.
Slide 4
Иерархия наследования
исключительных ситуаций
Throwable
Error
…
Exception
IOException
Runtime
Exception
…
Error – внутренние ошибки, связанные с исчерпанием ресурсов.
Возбудить объект подобного типа программист не может!
Exception – основная иерархия ошибок, которой следует уделять
внимание.
Slide 5
Иерархия Exception
Исключительные ситуации RuntimeException возникают
вследствие ошибок программирования. Все другие
исключительные ситуации – стечение обстоятельств.
RuntimeException
другие
Правило:
Неверное
приведениеситуация
типов RuntimeException, то это Ваша
есливозникла
исключительная
вина!
Выход за допустимые пределы массива
Попытка
обратиться
к объекту
ссылке null –
Все ошибки,
производные
от класса
Error по
и RuntimeError,
неконтролируемые,
все
остальные
– контролируемые.
Обрыв файла
Попытка соединиться с неправильным URL
Попытка обнаружить несуществующий объект класса Class
Slide 6
Объявление исключительных
ситуаций, возбуждаемых методом
Идея – метод предсказывает, какие ошибки могут возникнуть.
class MyAnimation{
public Image loadImage(String s) throws IOException,
MalformedURLException{
…
}
}
Неконтролируемые исключительные ситуации от классов
Error и RuntimeException объявлять не нужно. Пример
class MyAnimation{
void drawImage(int i) throws ArrayIndexOutOfBoundsException{
…
}
}
Slide 7
Возбуждение исключительных
ситуаций
Пример. Метод 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. Возбудить его.
Slide 8
Создание классов
исключительных ситуаций
Если в программе возникает ситуация, не предусмотренная
ни одним из существующих классов исключения, достаточно
создать свой собственный класс от 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; }
Slide 9
Перехват исключительных
ситуаций (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();}
исключения, то метод
}
останавливает работу.
Slide 10
Распространение
исключительных ситуаций
Если в методе 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;} }
}
Slide 11
Перехват нескольких исключений
try {…}
catch (MalformedURLException e1){
…}
catch (UnknownHostException e2){
…}
catch (IOException e3){
…}
Объекты (e1, e2, e3)
исключительных
ситуаций могут
содержать информацию
о ней - e3.getMessage();
Тип объекта можно
определить
e3.getClass().getName()
.
Slide 12
Повторное возбуждение
исключительной ситуации
Иногда нужно перехватить исключение, сделать некоторые
действия и отправить исключение на дальнейшую обработку
в вызывающий метод:
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”);}
Slide 13
Раздел finally
Graphics g = image.getGraphics();
try{ код, который может вызвать исключение;}
catch(IOException e){}
finally{
g.dispose();}
Graphics g = image.getGraphics();
try{ код, который может вызвать исключение;}
finally{
g.dispose();}
Slide 14
Обработка событий
Slide 15
Модель событий
Любой графический компонент может инициировать событие.
Каждое отдельное событие представлено определенным
классом. Когда событие инициируется, оно принимается
одним или несколькими слушателями Listener, которые его
обрабатывают. Таким образом, источник события и место его
обработки могут быть разнесены.
Слушатель каждого события – объект класса, реализующий
определенный вид интерфейса, характерного для всех
слушателей этого события. Необходимо создать объектслушатель и зарегистрировать его в компоненте, который
порождает событие. Слушатель – объект, заинтересованный
в получении события.
Slide 16
Модель событий
В объекте, который порождает событие, содержится список
слушателей, заинтересованных в получении уведомления,
что событие произошло. Источник оповещает слушателя
путем вызова спецметода и передачи события EventObject.
Регистрация события происходит с помощью метода
addXXXListener, принадлежащего компоненту, вызвавшему
событие, где XXX – тип обрабатываемого события
Метод getSource() класса event возвращает объект,
вызвавший событие
Удаление слушателя производится методом
removeXXXListener
Slide 17
Slide 18
Модель событий
В интерфейсе слушателя может определятся несколько
методов, например для MouseEvent. Если какой-либо класс
реализовывает интерфейс, то он обязан реализовать все
его методы. Это не удобно, если нас интересует всего один
из нескольких. Для этого для каждого интерфейса
слушателя, содержащего несколько методов, определен
простой класс адаптер, в котором эти методы пустые. Если
необходимо, то их можно переопределять.
Public class windowclosing extends WindowAdapter{
public void windowClosing(WindowEvent e){
………..}
}
Slide 19
Slide 20
Пример
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);
......}
}
Slide 21
Пример
Можно не описывать как в предыдущем примере класс,
реализующий интерфейс, а затем создавать его экземпляр.
Следующий пример реализует те же действия, но более
коротким путем.
private ActionListener bl = new ActionListener() {
public void actionPerformed(ActionEvent e) {
String name = ((JButton)e.getSource()).getText();
txt.setText(name);
}
Slide 22
Некоторые важные интерфейсы
MouseMotionListener и MouseMotionEvent:
mouseMoved()
mouseDragged()
MouseListener и MouseEvent:
mousePressed()
mouseReleased()
mouseClicked()
Методы события getX() и getY() возвращают координаты
Slide 23
Некоторые важные интерфейсы
KeyListener и KeyEvent:
keyTyped()
keyPressed()
keyReleased()
Метод события KeyEvent getKeyChar() возвращает символ
Исключительные ситуации в
Java и обработка событий
Slide 2
Обработка ошибок
Назначение механизма обработки
исключительных ситуаций – передача
данных из того места кода, где возник сбой,
обработчику ошибок, который может
справиться с ними.
При возникновении ошибок программа
должна сделать одно из двух:
вернуться в безопасное состояние и позволить
пользователю выполнить другие команды;
дать пользователю возможность сохранить
результаты своей работы и аккуратно
завершить программу.
Slide 3
Наиболее “популярные” виды
ошибок
Ошибки ввода (неправильный адрес
сайта)
Сбои оборудования (принтер отключен,
сайт недоступен)
Физические ограничения (переполнен
диск, исчерпана память)
Ошибки программирования (неверная
работа методов)
При возникновении ошибки возбуждается
объект, инкапсулирующий информацию об
ошибке.
Slide 4
Иерархия наследования
исключительных ситуаций
Throwable
Error
…
Exception
IOException
Runtime
Exception
…
Error – внутренние ошибки, связанные с исчерпанием ресурсов.
Возбудить объект подобного типа программист не может!
Exception – основная иерархия ошибок, которой следует уделять
внимание.
Slide 5
Иерархия Exception
Исключительные ситуации RuntimeException возникают
вследствие ошибок программирования. Все другие
исключительные ситуации – стечение обстоятельств.
RuntimeException
другие
Правило:
Неверное
приведениеситуация
типов RuntimeException, то это Ваша
есливозникла
исключительная
вина!
Выход за допустимые пределы массива
Попытка
обратиться
к объекту
ссылке null –
Все ошибки,
производные
от класса
Error по
и RuntimeError,
неконтролируемые,
все
остальные
– контролируемые.
Обрыв файла
Попытка соединиться с неправильным URL
Попытка обнаружить несуществующий объект класса Class
Slide 6
Объявление исключительных
ситуаций, возбуждаемых методом
Идея – метод предсказывает, какие ошибки могут возникнуть.
class MyAnimation{
public Image loadImage(String s) throws IOException,
MalformedURLException{
…
}
}
Неконтролируемые исключительные ситуации от классов
Error и RuntimeException объявлять не нужно. Пример
class MyAnimation{
void drawImage(int i) throws ArrayIndexOutOfBoundsException{
…
}
}
Slide 7
Возбуждение исключительных
ситуаций
Пример. Метод 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. Возбудить его.
Slide 8
Создание классов
исключительных ситуаций
Если в программе возникает ситуация, не предусмотренная
ни одним из существующих классов исключения, достаточно
создать свой собственный класс от 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; }
Slide 9
Перехват исключительных
ситуаций (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();}
исключения, то метод
}
останавливает работу.
Slide 10
Распространение
исключительных ситуаций
Если в методе 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;} }
}
Slide 11
Перехват нескольких исключений
try {…}
catch (MalformedURLException e1){
…}
catch (UnknownHostException e2){
…}
catch (IOException e3){
…}
Объекты (e1, e2, e3)
исключительных
ситуаций могут
содержать информацию
о ней - e3.getMessage();
Тип объекта можно
определить
e3.getClass().getName()
.
Slide 12
Повторное возбуждение
исключительной ситуации
Иногда нужно перехватить исключение, сделать некоторые
действия и отправить исключение на дальнейшую обработку
в вызывающий метод:
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”);}
Slide 13
Раздел finally
Graphics g = image.getGraphics();
try{ код, который может вызвать исключение;}
catch(IOException e){}
finally{
g.dispose();}
Graphics g = image.getGraphics();
try{ код, который может вызвать исключение;}
finally{
g.dispose();}
Slide 14
Обработка событий
Slide 15
Модель событий
Любой графический компонент может инициировать событие.
Каждое отдельное событие представлено определенным
классом. Когда событие инициируется, оно принимается
одним или несколькими слушателями Listener, которые его
обрабатывают. Таким образом, источник события и место его
обработки могут быть разнесены.
Слушатель каждого события – объект класса, реализующий
определенный вид интерфейса, характерного для всех
слушателей этого события. Необходимо создать объектслушатель и зарегистрировать его в компоненте, который
порождает событие. Слушатель – объект, заинтересованный
в получении события.
Slide 16
Модель событий
В объекте, который порождает событие, содержится список
слушателей, заинтересованных в получении уведомления,
что событие произошло. Источник оповещает слушателя
путем вызова спецметода и передачи события EventObject.
Регистрация события происходит с помощью метода
addXXXListener, принадлежащего компоненту, вызвавшему
событие, где XXX – тип обрабатываемого события
Метод getSource() класса event возвращает объект,
вызвавший событие
Удаление слушателя производится методом
removeXXXListener
Slide 17
Slide 18
Модель событий
В интерфейсе слушателя может определятся несколько
методов, например для MouseEvent. Если какой-либо класс
реализовывает интерфейс, то он обязан реализовать все
его методы. Это не удобно, если нас интересует всего один
из нескольких. Для этого для каждого интерфейса
слушателя, содержащего несколько методов, определен
простой класс адаптер, в котором эти методы пустые. Если
необходимо, то их можно переопределять.
Public class windowclosing extends WindowAdapter{
public void windowClosing(WindowEvent e){
………..}
}
Slide 19
Slide 20
Пример
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);
......}
}
Slide 21
Пример
Можно не описывать как в предыдущем примере класс,
реализующий интерфейс, а затем создавать его экземпляр.
Следующий пример реализует те же действия, но более
коротким путем.
private ActionListener bl = new ActionListener() {
public void actionPerformed(ActionEvent e) {
String name = ((JButton)e.getSource()).getText();
txt.setText(name);
}
Slide 22
Некоторые важные интерфейсы
MouseMotionListener и MouseMotionEvent:
mouseMoved()
mouseDragged()
MouseListener и MouseEvent:
mousePressed()
mouseReleased()
mouseClicked()
Методы события getX() и getY() возвращают координаты
Slide 23
Некоторые важные интерфейсы
KeyListener и KeyEvent:
keyTyped()
keyPressed()
keyReleased()
Метод события KeyEvent getKeyChar() возвращает символ