Java程序设计案例教程-模块.ppt

上传人:牧羊曲112 文档编号:6510007 上传时间:2023-11-07 格式:PPT 页数:41 大小:370.50KB
返回 下载 相关 举报
Java程序设计案例教程-模块.ppt_第1页
第1页 / 共41页
Java程序设计案例教程-模块.ppt_第2页
第2页 / 共41页
Java程序设计案例教程-模块.ppt_第3页
第3页 / 共41页
Java程序设计案例教程-模块.ppt_第4页
第4页 / 共41页
Java程序设计案例教程-模块.ppt_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《Java程序设计案例教程-模块.ppt》由会员分享,可在线阅读,更多相关《Java程序设计案例教程-模块.ppt(41页珍藏版)》请在三一办公上搜索。

1、,模块五 异常处理与多线程设计,目标 Java语言支持多线程,所谓线程,指的是程序内部的顺序控制流,线程本身并不是程序,自身不能运行,必须在程序中运行,本模块将介绍线程的构造,以及线程的同步。,学习本模块涉及哪些重要内容?,本模块导读无论使用哪种语言进行程序设计,出错处理是非常重要的一个方面。导致异常发生的原因有很多种,比如数组越界、除数为零、访问的文件不存在等等。Java语言是使用面向对象的方法通过异常进行出错处理的,本模块将介绍什么是异常及如何处理程序中出现的异常。Java语言支持多线程,所谓线程,指的是程序内部的顺序控制流,线程本身并不是程序,自身不能运行,必须在程序中运行,本模块将介绍

2、线程的构造,以及线程的同步。,学习本模块涉及哪些重要内容?,本模块要点理解异常的产生和处理机制掌握如何捕获异常、抛出异常掌握如何构造线程并控制线程的同步,任务一异常的产生和处理机制,知识点详解异常的定义异常就是在程序运行过程中出现的不正常事件,该事件会中断指令的正常执行。异常是程序运行时遇到的任何错误情况或意外行为。下列情况都可以产生异常:程序代码或所调用的代码(如共享库)中有错误,如除数为0;操作系统资源不可用,如试图对只读文件进行写操作;公共语言运行库遇到意外情况(如无法验证代码)等。对于这些情况,应用程序可以对某些错误结果恢复到出错前的状态,而对于另一些错误,则不能恢复。在设计程序时,应

3、考虑到可能出现的异常情况,避免由于异常导致系统崩溃的发生。处理异常情况的能力越强,则说明程序的健壮性越好。,任务一异常的产生和处理机制,知识点详解异常类的类层次在Java语言中异常是一些特殊的类,其层次关系如图所示。所有的异常类都继承于类throwable。异常类整体分为两类,一类继承于类Error,这类异常通常不由程序捕获和处理;另一类继承于Exception,在程序中大量处理的就是这类异常。在这类异常中,还分运行时异常(继承于RuntimeException)和非运行时异常,通常程序中不处理运行时异常,而是把它交给Java运行时系统。除运行时异常的其他继承于Exception的子类是非运行

4、时异常,对于这类异常,如果程序不进行处理,可能会使程序运行得到意想不到的结果,因此Java编译器要求程序必须处理(包括捕获或声明抛弃)这类异常。,任务一异常的产生和处理机制,知识点详解,图5-1 异常类的层次关系,任务一异常的产生和处理机制,知识点详解异常的处理机制在Java程序的执行过程中,倘若出现了异常事件,就会生成一个异常对象,该对象可能由Java虚拟机生成,也可能由程序中正在进行的方法生成,包含一些指明异常事件类型和异常发生时程序运行的状态信息。生成的异常对象将传递给Java运行时系统,通常称异常的产生和提交过程为抛出异常,对应的保留字为throw。运行时系统得到异常对象后,就会寻找该

5、异常的代码。系统首先从生成异常对象的代码快开始寻找,接着对方法的栈进行逐层回溯,一直到找到一个能够处理该异常的方法为止,随后,运行时系统把当前异常对象交给寻找到的方法处理,这个过程通常称为异常的捕获,对应的关键字为catch。如果Java运行时系统没有找到可以处理该异常的方法,运行时系统就会终止运行,运行的Java程序就会随之退出运行。,任务一异常的产生和处理机制,知识点详解例如:算术运算异常(由除0错误导致)完整的程序代码如下:class Test public int devide(int x,int y)i nt result=x/y;return result;class Except

6、ionTest1 public static void main(String args)new text().devide(3,0);【1】System.out.println(program is running here!);,任务一异常的产生和处理机制,知识点详解代码详解【1】/*调用类Test对象的devide方法,并向形参x、y传递实参:3、0,传递的参数除数为0*/例题中由于main函数中【1】语句向“int result=x/y;”语句传递的参数y=0,即除数为0,导致程序运行时出现异常。屏幕上出现如下信息:Exception in thread“main”java.lang.

7、ArithmeticException:/by zeroat Text.decide(ExceptionTest1.java:5)at ExceptionText1.main(ExceptionTest1.java:14)其中,“ArithmeticException”类为算术运算异常类,出现异常后,程序无法继续进行。,任务二异常捕获,知识点详解【案例】试题选择时异常的捕获实现该案例的代码段如下:try if(in!=null,任务二异常捕获,知识点详解 correctAnswer=(read.readLine().trim();String temp=(read.readLine().tri

8、m();StringTokenizer token=new StringTokenizer(temp,:);int hour=Integer.parseInt(token.nextToken();int minute=Integer.parseInt(token.nextToken();int second=Integer.parseInt(token.nextToken();time=1000*(second+minute*60+hour*60*60);catch(Exception e)【1】testContent=没有选择试题;【2】,任务二异常捕获,知识点详解代码详解程序中字符“e”指

9、异常对象,可以用任意标识符表示,但通常习惯用字母“e”表示。给出处理try代码块中所生成的异常事件的方法,运行时屏幕会显示出发生了怎样的异常情况。catch中的这条语句可以省略,不影响程序的继续运行,但不利于提醒用户及时发现程序中出现了怎样的异常情况。捕获异常下面介绍如何捕获异常。即try代码块中抛出了一个异常,接着利用catch语句输出一些与该异常相关的信息。捕获异常就是在某个方法中对某种类型的异常对象提供了相应的处理方法,捕获异常是通过try-catch-finally语句来实现的,该语句的格式如下:,任务二异常捕获,知识点详解 try catch(ExceptionType1 excep

10、tionobject)catch(ExceptionType2 exceptionobject)finally,任务二异常捕获,知识点详解下面介绍try-catch-finally语句各部分的用法。Try try代码块选定捕获异常的范围,try代码块所限定的语句在执行过程中可能会生成异常对象并抛出异常对象。Catch catch语句用于处理try代码块中所生成的异常事件,而且catch语句可以是多个,catch语句带有一个形式参数,参数类型指明能够捕获的异常类型,该异常类型必须是Throwable类的子类,程序运行时,系统就会通过参数值把被抛出的异常对象传递给catch代码块。Finally

11、finally语句为异常处理提供一个统一的出口,不管try代码块中是否发生了异常事件,finally块中的语句都会被执行。,任务二异常捕获,知识点详解抛出异常例如:抛出异常的声明访问不存在的文件。完整的程序代码如下:import java.io.*;class ExceptionTest3 public static void main(String args)throws IOException/*throws关键字抛出异常*/FileInputStream streamobj=new FileInputStream(“readme.txt);System.out.println(“prog

12、ram is running here!”),任务二异常捕获,知识点详解信息卡异常类“IOException”为输入输出异常,是异常类“Exception”的子类。通过throws语句声明抛出异常,这样就不用在main方法中用catch语句捕获异常,但需要注意,要想上面的程序能够运行通过,需要保证当前路径下存在readme.txt文件。如果文件不存在,throws 语句只能使程序通过编译,而不能通过运行。声明抛出异常就是在方法声明中通过throws子句指明,格式如下:returntype methodName()throws ExceptionName 其中,returntype是方法的返回类

13、型,methodName为方法的名称,ExceptionName为抛出的异常类型。,任务二异常捕获,知识点详解完整的程序代码如下:class Test4 public int devide(int x,int y)throws Exception if(y0)throw new Devide2(“devide is”+y);【4】int result=x/y;return result;class Devide2 extends Exception【1】public Devide2(String msg)【2】super(msg);【3】,任务二异常捕获,知识点详解 class Excepti

14、onTest1 public static void main(String args)try new Test().devide(3,2);catch(exception e)【5】System.out.println(e.getMessage();System.out.println(“program is running here!”),任务二异常捕获,知识点详解代码详解自定义异常类型,类名为Devide2,自定义的异常类必须继承Execption类。异常类的构造方法,这个方法接受一个字符串。调用父类的构造函数。生成自己的异常对象,并抛出这个异常。根据抛出的异常,生成异常对象e,并通过t

15、ry-catch语句捕获住异常。屏幕显示运行结果:devide is 2。,任务三多线程设计,子任务1 线程体的构造知识导读【案例】线程体的构造、启动与访问当前线程对象名完整的程序代码如下:class TestThread5public static void main(String args)minthread tt=new minthread();【2】tt.start();【3】while(true)System.out.println(“main():”+Thread.currentThread().getname();【5】,任务三多线程设计,子任务1 线程体的构造知识导读class

16、 minthread extends Thread【1】public void run()【4】while(true)System.out.println(“Run():”+Thread.currentThread().getname();,任务三多线程设计,子任务1 线程体的构造知识导读程序运行结果显示:main():mainRun():Thread-1Run():Thread-1 两个System.out.println()语句的内容无规则交替打印输出,说明启动了两个线程,一个是main方法的内容,一个是run方法的内容。,注意,任务三多线程设计,子任务1 线程体的构造知识导读代码详解Ja

17、va的线程是通过java.lang软件包中的Thread类来实现的,可以通过minthread类继承了Thread类,为Thread类的子类。创建一个minthread子类的对象tt。对象tt通过start()方法启动线程。minthread()子类重写Thread类的Run()方法。currentThread()方法用来返回一个线程类的对象,getname()获取对象的名称。,任务三多线程设计,子任务1 线程体的构造知识点详解多线程概述线程的定义:线程与进程相似,是一个执行的程序,是程序中单个顺序的流控制:但与进程不同的是,同类的多个线程(multithread)是共享一块内存空间和一组系统

18、资源的,而线段本身的数据通常只有微处理器的寄存器数据,以及一个供程序执行时使用的堆栈。所以系统在产生一个线程,或者在各个线程之间切换时,负担要比进程小的多,正因为如此,线段被称为轻负荷进程。一个进程4呵以包含多个线程。单线程与多线程有什么区别呢?,任务三多线程设计,子任务1 线程体的构造知识点详解以上例为例,如果类minthread不是类Thread的子类,同时main函数中不用tt.start();语句启动另一个线程,而直接用new minthread().run();语句调用run()方法,由于run()方法中的while()循环的条件永远为true,因此,程序一直执行run()中的循环语

19、句,而无法执行main函数System.out.println(“main():”+Thread.currentThread().getname();语句,此为单线程;而上例中Java的线程是通过java.lang软件包中的Thread类来实现的,通过minthread类继承了Thread类,为Thread类的子类,同时通过start()方法启动了新线程,因此,两个线程无规则交替使用,此为多线程。,任务三多线程设计,子任务1 线程体的构造知识点详解用Thread类创建线程要将一段代码在一个新的线程上运行,该代码应该在一个类的run函数中,并且run函数所在的类是Thread类的子类。即:要实现

20、多线程,必须编写一个继承了Thread类的子类,子类要覆盖Thread类中的run函数,在子类的run函数中调用想在新线程上运行的程序代码。启动一个新的线程,我们不是直接调用Thread的子类对象的run方法,而是调用Thread类对象的start方法将产生一个新的线程,并在该线程上运行该Thread类对象中的run方法。,任务三多线程设计,子任务1 线程体的构造知识点详解格式如下所示:Thread countTime=new Thread(this);/含义是创建一个线程对象countTime,Thread类从this所指的对象中获得run方法。countTime.start();/启动该线

21、程,任务三多线程设计,子任务1 线程体的构造知识点详解【案例】Runnable接口构造线程。完整的程序代码如下:class TestThread6public static void main(String args)Thread tt=new Thread(new minthread();【2】tt.start();while(true)System.out.println(“main():”+Thread.currentThread().getname();,任务三多线程设计,子任务1 线程体的构造知识点详解class minthread implement Runnable【1】publ

22、ic void run()while(true)System.out.println(“run():”+Thread.currentThread().getname();,任务三多线程设计,子任务1 线程体的构造知识点详解这是实现线程体的另一种构造方法,不调用Thread中的run方法,而是调用Runnable中的run方法作为线程的执行代码。程序运行结果与前一案例中创建Thread类子类对象执行线程并无差别。,注意,任务三多线程设计,子任务1 线程体的构造知识点详解代码详解提供一个实现Runnable接口的类作为线程的目标对象。创建线程对象,并传递了一个Runnable类型的线程对象。通过实

23、现Thread类的子类,重写继承的run方法定义线程体,然后创建该子类的对象创建线程。例如:public class MyThread extends Threadpublic run()System.out.println(MyThread.run();,任务三多线程设计,子任务1 线程体的构造知识点详解在合适的地方启动线程:new MyThread().start();由于Java只支持单重继承,用这种方法定义的类不能再继承其他父类。如果自己的类已经extends另一个类,就无法直接extends Thread,此时,必须实现一个Runnable接口:public class MyThre

24、ad extends OtherClass implements Runnable public run()System.out.println(MyThread.run();,任务三多线程设计,子任务1 线程体的构造知识点详解通过在类中实现Runnable接口,并在该类中提供run()方法的实现,用这种方法定义的类可以再继承其他父类。,任务三多线程设计,子任务2 线程的同步知识点详解【案例】存取数据的部分代码。完整的程序代码如下:class Aprivate int s;private boolean bflag=false;public synchronized int get()whil

25、e(bflag=false)try,任务三多线程设计,子任务2 线程的同步知识点详解wait();/等待put中调用notify()catch(InterruptedException e)bflag=false;notify();return s;public synchronized int put(int value)while(bflag=true),任务三多线程设计,子任务2 线程的同步知识点详解trywait();/等待get中调用notify()catch(InterruptedException e)s=valuebflag=true;notify();,任务三多线程设计,子任

26、务2 线程的同步知识点详解在Java语言中,提供了关键字synchronized为同步语句块儿,来实现对象的“互斥锁”联系,当某个对象或方法用关键字synchronized修饰时表明该对象或方法只能有一个线程执行,其他线程处于等待状态。如果synchronized用在类的声明中,表明这类中的所有方法都是synchronized的。同步线程的执行需要使用wait()、notify()、notifyAll()方法,这些方法的说明如下:wait()、notify()、notifyAll()三种方法只能出现在synchronized作用的范围内。,任务三多线程设计,子任务2 线程的同步知识点详解wai

27、t()、notify()、notifyAll()三种方法只能出现在synchronized作用的范围内。wait()方法的作用是:释放已持有的锁,进入wait队伍。notify()方法的作用是唤醒wait队列中的第一个线程,并将该线程移入互斥锁申请队列。notifyAll()方法的作用是唤醒wait队列中的所有的线程,并将这些线程移入互斥锁申请队列。,学材小结,理论知识填空题1、Java支持多线程有两个方法和_。2、在Java语言中多线程程序设计的两种方法是_和_。3、线程的四种状态是 _、_、_、_。4、指定线程阻塞多长时间的方法是_。5、在Java语言中,线程的实现部分(线程体)应书写在方法_中。6、在Java语言中,实现线程的同步执行要用到关键字_。判断题:判断下面说法是否正确?为什么?1、要在程序中实现线程必须导入类。2、线程之间可以共享数据。3、启动线程时可以调用run()方法或start()方法。,学材小结,理论知识实训任务1、在异常处理结构中finally模块起什么作用?2、编写一段程序计算y(x十c)(xc)。处理当xc0时的异常。拓展练习运用已学线程知识,完成考试系统中计时器线程,考试开始计时,提示栏显示所剩余的考试时间,当规定时间用尽后,用户将不能再读取任何题目。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号