И.Н. Блинов, В.С. Романчик - Основы программирования на языке Java (1160783), страница 7
Текст из файла (страница 7)
В этом случае используется блокfinally, который выполняется после блоков try или catch. Например:39try{/*код, который может вызвать исключение*/}catch(Exception e){/*обработка исключения*/}finally{/*выполняется или после try, или после catch }У каждого раздела try должен быть по крайней мере или один раздел catch, или блок finally.
Блок finally используется для закрытияфайлов и освобождения других ресурсов, захваченных для временного использования в начале выполнения метода. Приведем пример:// пример #5 : выполнение блоков finally: SampleFinally.javaclass SampleFinally {static void procA() {try {System.out.println("внутри метода procA()");throw new RuntimeException("демонстрация исключения"); }finally { System.out.println("блок finally метода procA()");}}static void procB() {try {System.out.println("внутри метода procB()"); return;}finally { System.out.println("блок finally метода procB()"); }}public static void main(String[] args) {try {procA();}catch (Exception e) {/*обработка */}procB();}}В методе procA() из-за генерации исключения происходит преждевременный выход из блока try, но до выхода из функции выполняется раздел finally.
Метод procB() завершает работу выполнениемстоящего в try-блоке оператора return, но и при этом перед выходомиз метода выполняется код блока finally.Можно создать собственное исключение как подкласс классаException и затем использовать при обработке ситуаций, возникающих после вызова методов. Рассмотрим пример:Book getBook() {try {Book b1 = object.searchBookRecord("Java 2"); }catch(NoBookFoundException npfe) { /*обработка */}}40При неудачном поиске книги вызывается NoBookFoundException,который использовался в качестве собственного исключения. Он принимает два аргумента.
Один из них − сообщение, которое может бытьвыведено в поток ошибок; другой − реальное исключение, котороепривело к вызову нашего исключения. Этот код показывает, как можно сохранить другую информацию внутри пользовательского исключения. Преимущество этого сохранения состоит в том, что если вызываемый метод захочет узнать реальную причину вызоваNoBookFoundException, он всего лишь должен вызвать методgetHiddenException(). Это позволяет вызываемому методу решить,нужно ли работать со специфичным исключением или достаточно обработки NoBookFoundException.//пример #6 :собственное исключение: NoBookFoundException.javapublic class NoBookFoundException extends Exception {private Exception hiddenException_;public NoBookFoundException(String error, Exception excp){super(error);hiddenException_ = excp; }public Exception getHiddenException(){return(hiddenException_); }}Упражнения1.
java.io.OutputStream out;public int increment() {try { counter++;out.write(counter); }Какой код нужно добавить в метод increment()?а) }; б) catch (java.io.IOException e) {; с) finally {; д) return.2. Что будет выведено при вызове manip(2)?public int manip(int x) { int count = 3;try { count += x; m1(x); count++; }catch(Exception e) { count -= x; }return count; }3. Что будет выведено при вызове m1(2), если m2() генерируетArithmeticException?public int m1(int x) { int count=1;try { count += x; count += m2(count); count++;catch(ArithmeticException e) { count -= x; }finally { count += 3; }return count; }8.
КЛАССЫ СОБЫТИЙ41Современный подход к обработке событий основан на модели делегирования событий. В этой модели блок прослушивания (Listener)ждет поступления события от источника, после чего обрабатывает егои возвращает управление. Источник – это объект, который генерируетсобытие, если изменяется внутреннее состояние источника.
Когда событие происходит, все зарегистрированные блоки прослушиванияуведомляются и принимают копию объекта события. Источник должен вызвать метод, регистрирующий блок прослушивания определенного события. Форма метода:public void addТипListener(ТипListener el)Здесь el – ссылка на блок прослушивания события, объект, получающий уведомление о событии. Таким образом, событие – это объекткласса событий, который описывает состояние источника.В корне иерархии классов событий находится суперклассEventObject (java.util). Этот класс содержит два метода: getSourсe() −возвращающий источник событий и toString() − возвращающийстрочный эквивалент события. Подкласс AWTEvent (java.awt) является суперклассом всех AWT-событий.
Метод getID() определяет типсобытий. Пакет java.awt.event содержит ряд классов событий:ActionEvent − генерируется при нажатии кнопки, двойном щелчкепо элементам списка, при выборе пункта меню.AdjustmentEvent – генерируется при изменении полосы прокрутки.ComponentEvent − генерируется если компонент скрыт, перемещен, изменен в размере или становится видимым.FocusEvent − генерируется если компонент получает или теряетфокус ввода.Класс InputEvent является абстрактным суперклассом событийввода (клавиатуры или мыши). Чтобы рассмотреть события, связанные с обработкой событий клавиатуры, необходимо реализовать интерфейс KeyListener.
При нажатии клавиши генерируется событие созначением KEY_PRESSED. Это приводит к запросу обработчика событий keyPressed(). Когда клавиша отпускается, генерируется событие со значением KEY_RELEASED и выполняется обработчикkeyReleased(). Если нажатием клавиши сгенерирован символ, то посылается уведомление о событии со значением KEY_TYPED и вызывается обработчик keyTyped()./* пример #1 : обработка нажатия клавиши : JMyKey.java */import javax.swing.*;import java.awt.*;42import java.awt.event.*;class JMyKey extends JFrame implements KeyListener {String keymsg = "";public JMyKey(){super();addKeyListener(this);}public void keyPressed(KeyEvent ke){}public void keyTyped(KeyEvent ke){keymsg = ke.getKeyChar() + "";repaint();}public void keyReleased(KeyEvent ke){}public void paint(Graphics g){g.clearRect(0, 0, 300, 200);g.drawString(keymsg, 10, 40);}public static void main(String[] args){JMyKey s = new JMyKey ();s.addWindowListener( new WindowAdapter() {public void windowClosing(WindowEvent e){ System.exit(0);}});s.setSize(new Dimension(300, 200));s.setTitle("обработка нажатия клавиш");s.setVisible(true);}}Обработка нажатия специальных клавиш (перемещение курсора,функциональных клавиш) производится в keyPressed().
Они не доступны через keyTyped().Абстрактный класс WindowAdapter используется для приема иобработки событий окна при создании объекта прослушивания. Класссодержит перегружаемые методы windowActivated(WindowEvent),вызываемый при активации окна, windowСlosing(WindowEvent), вызываемый при закрытии окна и др.При создании кнопки вызывается конструктор JButton со строкой,которую нужно поместить на кнопке. JButton − это компонент, который автоматически перерисовывается как часть обновления без явного вызова перерисовки. Просто элемент добавляется на форму, и онаавтоматически заботится о своей перерисовке. Размещение кнопки на43форме производится внутри метода init().
Для добавления к интерфейсу новых элементов управления используется метод add() классаContainer.// пример #2 : добавление кнопки в апплет : MyButton.javaimport javax.swing.*;import java.awt.*;public class MyButton extends JApplet {JButton myB = new JButton("старт");public void init() {Container c = getContentPane();c.setLayout(new FlowLayout());c.add(myB);}}В примере был использован "менеджер компоновки" FlowLayout,который является причиной того, что управляющие элементы равномерно плавают на форме, слева направо и сверху вниз.
Менеджеркомпоновки − это способ, которым панель решает, где поместитьуправляющий элемент на форме. Если запустить приведенный апплет,при нажатии кнопки ничего не произойдет, потому что необходимонаписать код для реагирования на это событие. Способ, которым этосовершается в компонентах Swing − это интерфейс (графические компоненты) и реализация (код, который запускается при возникновениисобытия). С одним компонентом может быть связано несколько событий. Каждое событие содержит сообщение, которое может быть обработано в разделе реализации.При использовании компонента JButton определяется событие,связанное с нажатием кнопки.
Для регистрации заинтересованностиблока прослушивания в этом событии вызывается методaddActionListener() класса JButton. Этот метод ожидает аргумент,являющийся объектом, реализующим интерфейс ActionListener. Интерфейс содержит единственный метод actionPerformed(), которыйнужно реализовать. Таким образом для присоединения кода кJButton, необходимо реализовать интерфейс ActionListener в классеи зарегистрировать объект этого класса в JButton черезaddActionListener(). Метод будет вызван при нажатии кнопки.Для иллюстрации результата нажатия кнопки используем компонент JTextField. Это поле, где может размещаться текст или текстможет быть изменен. Хотя есть несколько способов созданияJTextField, самым простым является сообщение конструктору нуж44ной ширины текстового поля.
Как только JTextField помещается наформу, можно изменять содержимое, используя метод setText().//пример #3 : ответ на нажатие кнопки : MyButton2.javaimport javax.swing.*;import java.awt.*;import java.awt.event.*;public class MyButton2 extends JApplet implements ActionListener{ String msg;JButton yes, no;JTextField txt;public void init() {yes = new JButton ("да");no = new JButton ("нет");txt = new JTextField(12);Container c = getContentPane();c.setLayout(new FlowLayout());c.add(yes);c.add(no);c.add(txt);yes.addActionListener(this);no.addActionListener(this);}public void actionPerformed(ActionEvent ae) {String str = ae.getActionCommand();if (str.equals("да")) msg = "нажата кнопка <да> ";else msg = " нажата кнопка <нет> ";txt.setText(msg);}}Создание JTextField и помещение его на панель − это действия,которые выполняются для любого компонента Swing.
Аргумент дляactionPerformed() представляет собой объект типа ActionEvent, содержащий всю информацию о событии. В примере JButton.getText()возвращает текст, который есть на кнопке, и помещает в JTextField.В методе init() используется addActionListener() для регистрации события обеих кнопок.Классы-адаптерыЭти классы содержат пустую реализацию всех методов из интерфейсов прослушивания событий, которые они расширяют. При этом45производится обработка только некоторых из событий, предоставляемых конкретным интерфейсом прослушивания. Определяется новыйкласс, действующий как блок прослушивания событий, расширяяодин из имеющихся адаптеров и реализуя только те события, которыетребуется обрабатывать.Например, класс MouseMotionAdapter имеет два метода:mouseDragged(), mouseMoved(). Сигнатуры этих пустых методовточно такие же, как в интерфейсе MouseMotionListener.