




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第7章 异常、事件和多线程机制 7.1 异常异常 7.2 事件事件 7.3 多线程机制多线程机制 习习 题题 7.1 异异 常常7.1.1 定义定义 异常是指当程序中某些地方出错时创建的一种特殊的运行时错误对象。Java创建异常对象后,就发送给Java程序,即抛出异常(throwing an exception)。程序捕捉到这个异常后,可以编写相应的异常处理代码进行处理。使用异常处理可以使得程序更加健壮,有助于调试和后期维护。7.1.2 异常类异常类 由继承类图可以看出,Throwable类派生了两个类:Exception类和Error类,其中Error类系统保留,而Exception类供应用
2、程序使用,它下面又派生出几个具体的异常类,都对应着一项具体的运行错误,如图7.1所示。图7.1 异常类图Throwable类InterruptedException类MalformedURLException类NullPointerException类ClassNotFoundException类Error类Exception类IOException类IllegalAccessException类Exception类中常用的方法为:public String toString() 返回异常的简短描述。public String getMessage() 返回异常的详细信息描述。异常类分为系统定
3、义的异常和用户自定义的异常。 1. 系统定义的异常系统定义的异常 图7.1中Exception派生的这些子类都是系统事先定义好并包含在Java类库中的,系统定义的异常对应着一些系统错误,如中断、文件没找到等错误。表7.1列举了一些常见的系统异常类。表表7.1 常见的系统异常类常见的系统异常类系统定义的运行异常 对应的系统错误 ArrayIndexOutofBoundsException 类 数组越界使用 ArithmaticException 类 算术错误,除数为 0 ClassNotFoundException 类 未找到欲装载使用的类 InterruptedException 类 中断错误
4、,线程操作时可能引发 IOException 类 输入、输出错误 MalformedURLException 类 输入的 URL 网址格式有错误 NullPointerException 类 空的尚未分配内存的对象 SecurityException 类 安全错误,如 Applet 欲读写客户端文件时引发 2. 用户自定义异常用户自定义异常 用户自定义异常用来处理用户应用程序中的特定逻辑的运行错误,用户自定义的异常类通常继承自Exception类,例如:public class UserDefineException extends Exceptionpublic UserDefineExce
5、ption(String msg)super(msg);7.1.3 异常处理异常处理 Java异常通常在调用某些方法不一定完全成功时抛出,针对抛出的异常程序需要给出相应的处理,这称为异常处理。异常处理分为三个部分:捕捉异常、程序流程的跳转和异常处理语句块。 当一个异常被抛出时,程序中有专门的语句来接收这个被抛出的异常对象,这个过程就是捕捉异常;当一个异常类的对象被捕捉或接收后,用户程序就会发生流程跳转,系统中止程序运行,跳转到异常处理语句的执行,或者直接跳出系统,回到操作系统状态下。在Java语言中,try语句用来启动Java的异常处理机制,通常是可能抛出异常的语句的调用;而catch语句进行
6、捕捉和处理异常,有时添加finally语句块,finally中的语句是正常执行或者处理异常之后必须执行的语句。语句格式如下:try语句块;catch(异常类 异常类参数名)异常处理语句块;finally try或者catch语句完毕后必须执行的语句(通常用于关闭文件流对象或者数据库对象等); 1. 直接抛出异常直接抛出异常例如:public void myMethod()tryurlName = new URL(http:/);getAppletContext().showDocument(urlName,right);catch(MalformedURLException e)System.
7、out.println(e.getMessage(); try部分试图打开一个网址http:/,如果不成功,比如网址输入错误,那么引发异常程序忽略try中的下一行代码,直接跳到catch块中执行语句System.out.println(e.getMessage(),打印出引发的异常的错误信息描述。其中MalformedURLException说明引发的异常可能是URL网址输入错误类。 2. 间接抛出异常间接抛出异常 例如:public void myMethod() throws MalformedURLExceptionurlName = new URL(http:/);getAppletC
8、ontext().showDocument(urlName,right);在方法后面直接抛出。3. 综合方法综合方法例如:public void myMethod() throws MalformedURLException tryurlName = new URL(http:/);getAppletContext().showDocument(urlName,right);catch(MalformedURLException e)System.out.println(e.getMessage();7.1.4 多异常的处理多异常的处理 多异常的处理使用多个catch来捕捉不同类的异常,Jav
9、a中对catch块的数量没有限制。格式如下:Try.catch(异常类1 标识符).catch(异常类2 标识符).finally.【例7.1】 测试多异常处理和自定义异常。源程序代码如下:/程序文件名UseMultiException.javapublic class UseMultiException extends Exceptionstatic String str1;static String str2;public static void main(String args)int i1 = 0;int i2 = 0;str1 = new String(args0);str2 = n
10、ew String(args1);String strResult = new String();tryread(str1, str2);i1 = Integer.parseInt(str1);i2 = Integer.parseInt(str2);int result = i1/i2;strResult = String.valueOf(result);catch(NumberFormatException e)strResult = 错误的数字: + e.getMessage();catch(ArithmeticException e)strResult = 被0除错误: + e.getM
11、essage();str1 = s1.trim();str2 = s2.trim();if (str1.equals(0) throw (new UserDefineException(本系统0不能为被除数); ;class UserDefineException extends Exceptionpublic UserDefineException(String msg)super(msg);具体运行测试如下,结果如图7.2所示。java UseMultiException 2gf 5数字格式出错。java UseMultiException 2gf 0数字格式出错,下面的程序代码不再执行,
12、无法抛出第二个异常。java UseMultiException 2 0被0除出错。java UseMultiException 0 3引发用户自定义错误。java UseMultiException 9 3 9/3的答案为3。图7.2 异常测试输出7.2 事事 件件 事件用于描述程序、系统和程序使用者之间的各种活动。这些事件由系统事先定义好,当用户在图形界面上单击控件或双击鼠标时就可能引发某个事件,而用户程序中需要编制相应的代码来对这些事件做出处理。 1. 事件源事件源 图形用户界面上每个可能产生事件的组件称为事件源。 2. 事件监听者事件监听者 Java系统中注册的用于接收特殊事件的类。不
13、同的事件对应着不同的监听者,要想事件被监听者监听并处理,则需先将事件源注册到监听者。 3. 事件处理流程事件处理流程 事件源触发事件并将事件作为一个参数传递给监听者,监听者实现某个接口中的抽象方法,从而实现对事件的处理。 Java的事件处理机制是一个委托事件模型,如图7.3所示。图7.3 Java事件处理机制Event事件调用并传递参数注册触发事件事件源注册:addListener方法监听者:Listener实现接口方法 事件源注册的方法如下: public void addActionListener(ActionListener l) 添加特定的动作,监听接收来自事件源的动作事件,如果l为
14、空,不会产生任何动作。 监听者实现的接口为ActionListener接口,接口ActionListener来自包java.awt.event。在此接口中只有一个方法: public void actionPerformed(ActionEvent e) 当事件对象e发生时,调用此方法。监听者就需要实现这个方法。 Java中常用的事件和相应的事件监听者如表7.2所示。表表7.2 常用事件及其监听者常用事件及其监听者事件描述 事 件 类 监 听 者 动作事件 ActionEvent ActionListener 文本事件 TextEvent TextListener 选择事件 ItemEvent
15、 ItemListener 调整事件 AdjustmentEvent AdjustmentListener 鼠标事件 MouseEvent MouseListener 键盘事件 KeyEvent KeyListener 7.2.1 动作事件动作事件(ActionEvent) ActionEvent包含一个事件,该事件为执行动作事件ACTION_PERFORMED。触发这个事件的动作为:(1) 点击按钮。(2) 双击列表中的选项。(3) 选择菜单项。(4) 在文本框中输入回车。 常用方法如下: public String getActionCommand() 返回引发某个事件的命令按钮的名字,如
16、果名字为空,那么返回标签值。 public void setActionCommand(String command) 设置引发事件的按钮的名字,默认设置为按钮的标签。【例7.2】测试动作事件。源程序代码如下:/程序文件名UseButton.javaimport java.awt.*;import java.awt.event.*;import java.applet.*;import java.applet.Applet;public class UseButton extends Applet implements ActionListenerString str1 = new Strin
17、g();Button b1; /声明按钮对象;Button b2;Color c;public void init() b1 = new Button(); b2 = new Button(按钮对象2); /添加事件监听者 b1.addActionListener(this); b2.addActionListener(this); this.add(b1); this.add(b2);public void start()b1.setLabel(按钮对象1);str1 = b2.getLabel();repaint();public void paint(Graphics g)g.setCo
18、lor(c);g.drawString(引发事件的对象的标签: + str1, 40,60);/实现接口中的方法,响应动作事件public void actionPerformed(ActionEvent e)String arg = e.getActionCommand();if(arg = 按钮对象1)c = Color.red;str1 = 按钮对象1;else if(arg = 按钮对象2)c = Color.blue;str1 = 按钮对象2;repaint(); 单击“按钮对象1”,引发对象1的单击事件,输出结果如图7.4所示;单击“按钮对象2”,引发对象2的单击事件,输出结果如图
19、7.5所示。图7.4 单击“按钮对象1”的输出图7.5 单击“按钮对象2”的输出7.2.2 文本事件文本事件(TextEvent) 文本事件即代表文本区域中文本变化的事件TEXT_VALUE_CHANGED,在文本区域中改变文本内容。 public void addTextListener(TextListener l) 添加特定的文本事件,监听者接收来自文本对象的文本事件。如果l为空,那么不会抛出任何异常,而且也不会完成任何动作。 public interface TextListener extends EventListener 用于接收文本事件的监听者接口。当对象的文本发生变化时,调用
20、监听者对象的方法。接口中的方法为:public void textValueChanged(TextEvent e) 当文本发生改变时调用。public Object getSource()发生事件的对象,从EventObject继承来的方法。【例7.3】测试文本事件。源程序代码如下:/程序文件名UseTextEvent.javaimport java.awt.*;import java.awt.event.*;import java.applet.*;import java.applet.Applet; public class UseTextEvent extends Applet imp
21、lements ActionListener, TextListener TextField tOld;TextArea tNew;Panel p;public void init() tOld = new TextField(25); tNew = new TextArea(8,25); /添加事件监听者 tOld.addActionListener(this); tOld.addTextListener(this); /设置界面 p = new Panel(new BorderLayout(); p.add(tOld,BorderLayout.NORTH); p.add(tNew,Bord
22、erLayout.SOUTH); add(p);/响应文本事件public void textValueChanged(TextEvent e)if(e.getSource() = tOld)tNew.setText(tOld.getText();/响应动作事件public void actionPerformed(ActionEvent e)if(e.getSource() = tOld)tNew.setText(); 在文本框中键入“你好,这是文本事件同步”字符串,可以看见文本区域中的字符跟随变化,如图7.6所示,这是响应文本事件。键入字符串后按回车键,则发生响应动作事件,将文本区域清空,
23、如图7.7所示。 图7.6 响应文本事件 图7.7 响应动作事件7.2.3 选择事件选择事件(ItemEvent) 选择事件中包含以事件为代表的选择项,选中状态发生变化的事件ITEM_STATE_ CHANGED。引发的动作为:(1) 改变列表类改变列表类List对象选项的选中或不选中状态。对象选项的选中或不选中状态。(2) 改变下拉列表类改变下拉列表类Choice对象选项的选中或不选中状态。对象选项的选中或不选中状态。(3) 改变复选按钮类改变复选按钮类Checkbox对象的选中或不选中状态。对象的选中或不选中状态。事件源对象注册的方法如下:public void addItemListen
24、er(ItemListener l) 添加特定的项监听者,接收对象的选择项发生变化的事件。public ItemSelectable getItemSelectable() ItemEvent事件的方法,返回产生事件的事件源对象。public interface ItemListener extends EventListener接收选项事件的监听者接口。当选项中事件发生时,调用监听对象的itemStateChanged方法。public void itemStateChanged(ItemEvent e)当用户选中一项或未选中一项时,调用这个方法。 【例7.4】测试选择事件。分别对设置颜色的
25、复选框和有三种字号10、12和14的组合框进行选择时,标签的颜色和字体发生变化。源程序代码如下:/程序文件名UseItemEvent.javaimport java.awt.*;import java.awt.event.*;import java.applet.*;import java.applet.Applet;public class UseItemEvent extends Applet implements ItemListenerCheckbox cDisp;Button btnDisp;Choice cFont;public void init() cDisp = new Ch
26、eckbox(红色); btnDisp = new Button(颜色显示); cFont = new Choice(); cFont.add(10); cFont.add(12); cFont.add(14); /添加事件 cDisp.addItemListener(this); cFont.addItemListener(this); add(cDisp); add(cFont); add(btnDisp);/接口事件public void itemStateChanged(ItemEvent e)Checkbox temp;Choice temp2;Font oldF;/复选框if(e.
27、getItemSelectable() instanceof Checkbox)temp = (Checkbox)(e.getItemSelectable();/选中为红色,否则为蓝色if(temp.getState()btnDisp.setBackground(Color.red);elsebtnDisp.setBackground(Color.blue);/组合框if(e.getItemSelectable() instanceof Choice)oldF = btnDisp.getFont();temp2 = (Choice)(e.getItemSelectable();String s
28、 = temp2.getSelectedItem();/设置字体btnDisp.setFont(new Font(oldF.getName(),oldF.getStyle(),Integer.parseInt(s); 当选中红色复选框和组合框中的字号为14时,显示界面如图7.8所示;当未选中红色复选框和选中组合框中的字号为10时,显示界面如图7.9所示。图7.8 选中红色和字号为14的界面 图7.9 未选中红色和字号为10的界面7.2.4 调整事件调整事件(AdjustmentEvent) 调整事件包含一个事件,即ADJUSTMENT_VALUE_CHANGED事件,当操纵滚动条改变其滑块位置
29、时引发动作。AjustEvent的方法如下: public Adjustable getAdjustable() 返回引发事件的对象。 public int getValue() 返回调整事件中的当前值。public void addAdjustmentListener(AdjustmentListener l) 添加调整监听者来接收来自对象的AdjustmentEvent实例。public interface AdjustmentListener extends EventListener接收调整事件的监听接口,有一个方法:public void adjustmentValueChanged
30、(AdjustmentEvent e) 可在调整改变时调用这个值。 【例7.5】测试调整事件。设置一个水平滚动条,取值为136,随着滑块的变化,滚动条的值将显示在文本区域中,并且字体大小也会跟随变化。源程序代码如下:/程序文件名UseAdjustmentEvent.javaimport java.awt.*;import java.awt.event.*;import java.applet.*;import java.applet.Applet;public class UseAdjustmentEvent extends Applet implements AdjustmentListen
31、erScrollbar s;TextArea txtValue;Panel p;public void init() s = new Scrollbar(Scrollbar.HORIZONTAL,0,1,10,36); /添加监听者 s.addAdjustmentListener(this); txtValue = new TextArea(5,25); /界面布局 p = new Panel(new BorderLayout(); p.add(s,BorderLayout.NORTH); p.add(txtValue,BorderLayout.SOUTH); add(p);public vo
32、id start()public void adjustmentValueChanged(AdjustmentEvent e)int value;Font oldF;if(e.getAdjustable() = s) /得到滚动条的值value = e.getValue();/将值写入文本区域txtValue.setText(new Integer(value).toString();/按照滚动条的值设置字体oldF = txtValue.getFont();txtValue.setFont(new Font(oldF.getName(),oldF.getStyle(),value); 随着滚
33、动条的变化,可以看见文本区域中的取值以及大小都会跟随变化,取值为10和取值为35时的效果各不相同,如图7.10和图7.11所示。图7.10 字号为10的界面 图7.11 字号为35的界面7.2.5 鼠标事件鼠标事件(MouseEvent) 表明画布或界面组件中发生的鼠标事件,包含按下鼠标、释放鼠标、单击鼠标、进入部件的地理位置的鼠标事件和退出部件的地理位置的鼠标事件,以及鼠标移动事件(鼠标移动和鼠标拖动)。 鼠标使用addMouseListener方法注册,通过MouseListener接收鼠标事件;鼠标还可以使用addMouseMotionListener方法注册,通过MouseMotion
34、Listener监听者监听鼠标移动事件。 监听者中有具体的方法分别针对上述具体的鼠标事件,系统能够自动分辨鼠标事件的类型并调用相应的方法,所以只需编码实现相应的代码就可以了。public int getButton() 返回哪个按钮发生变化。public int getClickCount() 返回与这个事件相关的鼠标单击的次数。public Point getPoint() 返回同源部件相对的事件发生的x、y位置。public int getX() 返回同源部件相对的事件发生的x位置。public int getY()返回同源部件相对的事件发生的y位置。 【例7.6】测试按钮和画布的鼠标事件
35、,包括单击、按下、进入和退出等。鼠标事件的演示如图7.12和7.13所示。源程序代码如下:/程序文件名UseMouseEvent.javaimport java.awt.*;import java.awt.event.*;import java.applet.*;import java.applet.Applet;public class UseMouseEvent extends Applet implements MouseListener, MouseMotionListenerButton btn;public void init() btn = new Button(演示鼠标事件);
36、 add(btn); /给按钮添加鼠标事件和鼠标移动事件 btn.addMouseListener(this); btn.addMouseMotionListener(this); /给画布添加鼠标事件和鼠标移动事件 this.addMouseListener(this); this.addMouseMotionListener(this);/单击事件public void mouseClicked(MouseEvent e)Point p = new Point();if(e.getSource() = btn)if(e.getClickCount() = 1)btn.setLabel(单击
37、鼠标);else if(e.getClickCount() = 2)btn.setLabel(双击鼠标);elseif(e.getClickCount() = 1)p = e.getPoint();showStatus(p.x + , + p.y + 单击鼠标);else if(e.getClickCount() = 2)p = e.getPoint();showStatus(p.x + , + p.y + 双击鼠标); /进入事件public void mouseEntered(MouseEvent e)if(e.getSource() = btn)btn.setLabel(进入Button
38、);elseshowStatus(进入Applet);public void mouseExited(MouseEvent e)if(e.getSource() = btn)btn.setLabel(退出Button);elseshowStatus(退出Applet);/按下事件public void mousePressed(MouseEvent e)if(e.getSource() = btn)btn.setLabel(按下鼠标);elseshowStatus(按下鼠标);/释放事件public void mouseReleased(MouseEvent e)if(e.getSource(
39、) = btn)btn.setLabel(松开鼠标);elseshowStatus(松开鼠标);/移动事件public void mouseMoved(MouseEvent e)if(e.getSource() = btn) btn.setLabel(移动鼠标);else showStatus(移动鼠标,新位置 + e.getX() + , + e.getY();/拖动事件public void mouseDragged(MouseEvent e)if(e.getSource() = btn)btn.setLabel(拖动鼠标);elseshowStatus(拖动鼠标);图7.12 状态行提示
40、鼠标移动位置 图7.13 提示“按下鼠标”7.2.6 键盘事件键盘事件(KeyEvent) 键盘事件有三个:键盘按键按下,按键释放,按键被敲击。常用方法如下:public char getKeyChar() 返回事件中键的字符。public int getKeyCode() 返回整数键码。public static String getKeyText(int keyCode) 返回描述这个键码的字符串,例如“HOME”、“F1”或者“A”等。public interface KeyListener extends EventListener用来接收键盘事件。使用方法addKeyListener
41、注册。针对键盘的三个事件接口提供相应的方法进行处理,具体方法如下:public void keyPressed(KeyEvent e) 按键时引发事件处理。public void keyReleased(KeyEvent e) 释放键时引发事件处理。public void keyTyped(KeyEvent e) 键入键时引发事件处理。例如,按键处理事件如下:public void keyPressed(KeyEvent e)char ch = e.getKeyChar();if(ch =Y | ch = y)txt.setText (同意);else if ch = N | ch = n (
42、)txt.setText (反对);elsetxt.setText (无效);7.3 多多 线线 程程 机机 制制7.3.1 线程简介线程简介 线程(thread)就是进程中的一个执行线索。Java虚拟机允许进程中同时执行多个线程。每个线程都有一个优先级。具有较高优先级的线程先执行。线程是操作系统分配 CPU 时间的基本实体。每一个应用程序至少有一个线程,也可以拥有多个线程。线程是程序中的代码流。多个线程可以同时运行并能共享资源。 线程与进程不同,每个进程都需要操作系统为其分配独立的地址空间,而同一进程中的各个线程是在同一块地址空间中工作。 在 Java 程序中,一些动态效果(如动画的实现、动
43、态的字幕等)常利用多线程技术来实现。 线程存在一个生命周期,由以下方法体现:(1) start()方法:启动一个线程。(2) run()方法:定义该线程的动作。(3) sleep()方法:使线程睡眠一段时间,单位为ms。(4) suspend()方法:使线程挂起。(5) resume()方法:恢复挂起的线程。(6) yield()方法:把线程移到队列的尾部。(7) stop()方法:结束线程生命周期并执行清理工作。(8) destroy()方法:结束线程生命周期但不做清理工作。 其中最常用的是方法start()、run()、sleep()、stop()。7.3.2 线程类和线程类和Runnab
44、le接口接口1. 建立建立Thread类的子类类的子类 class myThread extends Thread .public void start()/启动线程 .public void run()/运行线程. 【例7.7】多线程实例,主函数给予调用,调用情况如图7.14所示。源程序代码如下:public class MThread public static void main(String args) System.out.println(Hello World!);thread2 t1 = new thread2(线程实例1); /创建线程实例t1.start(); /调用thre
45、ad2 t2 = new thread2(线程实例2);t2.start();thread2 t3 = new thread2(线程实例3);t3.start(); /自定义线程类thread2class thread2 extends ThreadThread thread; /定义线程实例String str;/构造函数public thread2(String str)this.str = str;/启动线程public void start()thread = new Thread(this);thread.start();public void run()int i = 0;while(thread != null)try/计数到5时睡眠10秒if(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 长沙高层住宅项目建筑安装工程技术投标书375P
- 消防安全责任落实机制试题及答案
- 黄金卷02(天津专用)-【赢在中考·黄金预测卷】2025年中考
- 全国江西科学技术版小学信息技术四年级上册第三单元第10课《身边的数据安全》教学设计
- 2025年其他计算机信息服务项目发展计划
- 学生心理问题的家庭干预
- 21《芦花鞋》教学设计-2023-2024学年四年级下册语文统编版
- 消防设施检修常见问题试题及答案
- 学生健康饮食与生活习惯的养成
- 书目数据的规范与标准化试题及答案
- 高中化学3.2醇酚讲义无答案新人教版选择性必修3
- SH/T 3533-2024 石油化工给水排水管道工程施工及验收规范(正式版)
- 新时代黄河流域高质量发展导论智慧树知到期末考试答案章节答案2024年聊城大学
- 2024年成都香城投资集团有限公司招聘笔试冲刺题(带答案解析)
- 2023版《思想道德与法治》(绪论-第一章)绪论 担当复兴大任 成就时代新人;第一章 领悟人生真谛 把握人生方向 第3讲 创造有意义的人生
- 心衰的治疗指南PPT2024
- 2024年LED手电筒行业技术趋势分析
- 医疗器械经营与药品经营的区别
- 钢丝绳吊装时最大允许吊装重物对应表
- 专题四“挺膺担当”主题团课
- 设计报价单模板
评论
0/150
提交评论