第6章 异常处理与多线程

上传人:gu****n 文档编号:243116362 上传时间:2024-09-16 格式:PPT 页数:36 大小:134.50KB
返回 下载 相关 举报
第6章 异常处理与多线程_第1页
第1页 / 共36页
第6章 异常处理与多线程_第2页
第2页 / 共36页
第6章 异常处理与多线程_第3页
第3页 / 共36页
点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,第六章 异常处理与多线程,1,本章重点,了解异常和异常分类,理解异常处理机制,try-,cathch,-finally,自定义异常,多线程,2,6.1,异常处理基础,含义,:,程序在运行过程中所发生的错误事件(如,数组越界、文件操作时未找到文件、除法溢出,等,),,而这些错误在设计时不能准确地识别出但,又可能会发生或者不会发生。,正确理解程序设计中的三种错误:,语法错误(编译时的错误);,逻辑错误(运行时的错误);,异常错误(运行时的错误但取决于执行环境)。,3,6.1,异常处理基础,Java,通过面向对象的方法来处理异常,,引入了异常类,(Exception),对于程序运行时,出现的异常事件,有其对应的错误处理机,制,.,每当程序运行过程中发生一个系统可识,别的运行错误时,系统就会产生该异常类,的一个对象并作出处理,确保不对系统造,成破坏,保证程序运行的安全性和强健性,.,4,6.2,异常处理的优点,异常处理的优点,(,OOP,方式的错误处理编程):,能将“错误处理”代码与“常规功能”代码相分离;,能将错误沿调用栈向上传播;,能按错误类型和错误对象分组,分门别类地加以处理。,允许类似于,Switch Case,语句的分类过滤错误例外,非结构化错误处理的缺点,代码很难阅读、调试和维护,容易忽视错误,5,6.2,异常处理的优点,Throwable,Error,Exception,Object,AWTException,RuntimeException,IOException,6,常见,RuntimeException,本类异常一般不用特意处理,只要细心可以避免!,7,常见非运行时异常,本类异常必须处理,我们所指的异常处理就是针对这样的异常。,8,6.3,异常处理机制,异常处理机制:主要体现在“抛出异常”并“捕获异常”这两个层次。,抛出异常:当程序执行过程中产生异常时,运行系统将抛出异常类对象(它代表某一异常类型的错误事件)。,捕获异常:用户程序或运行系统可以捕获该异常类对象(在函数的调用栈中查找能处理此异常事件的程序为止)并相应地给出处理的方法(代码)。,如何捕获异常:采用,try,、,catch,、,finally,语句块。,9,6.3,异常处理机制,捕获异常,try,语句块,:,它指定可能会产生异常的语句范,围,也即为,catch,规定异常捕获的语句范围。,catch,语句块:它指明需要捕获异常事件的类,型并相应地给出处理的方法(代码)。,finally,:它指定一代码块,不管是否有异常产,生或是否捕获住该异常,程序都从此处继续向后,执行。从而达到提供统一的出口(如关闭文件、,清除系统资源等)。,10,6.3,异常处理机制,捕获异常,try/catch,异常处理代码块的基本形式,try,/,监视,可能发生异常的代码块,;,catch,(异常类型 异常对象名),/,捕获并处理异常,异常处理代码块,;,【finally ,必须执行的代码,;】,当抛出一个异常时,异常会由相应的,catch,语句捕获并处理,.,与一个,try,相关的,catch,语句可以有多个,构成多重,catch,语句,异常类型决定了要执行哪个,catch,语句,.,如果没有抛出异常,那么,try,代码块就会结束,并且会跳过它的所有,catch,语句,从最后一个,catch,后面的第一个语句继续执行,.,11,6.3,异常处理机制,捕获异常,例,使用,try/catch,进行异常处理的情况,.,public class ExceptionExam0,public static void,main(String,args,),int,i,a,;,try /,监视一代码块,i=0;,a=42/i;,return;,catch (,ArithmeticException,e), /,捕获一个被零除异常,System.out.println,(,被零除,);,12,6.3,异常处理机制,捕获异常,与一个,try,相关的,catch,语句可以有多个,.,每一个,catch,语句捕获一个不同类型的异常,.,某些情况,由单个代码段可能引起多个异常,.,处理这种情况时就需要定义两个或更多的,catch,子句,每个子句捕获一种类型的异常,.,当异常被引发时,每一个,catch,子句被依次检查,第一个匹配异常类型的子句被执行,.,当一个,catch,语句执行以后,其他的子句被忽略,程序从,try/catch,块后的代码开始继续执行,.,13,6.3,异常处理机制,捕获异常,例,捕获两种不同类型的异常,public class ExceptionExam3,public static void,main(String,args,),try,int,i =,args.length,;,System.out.println(i,=+i);,int,j=5/i;,int,k= 1,2,3 ;,k5=0;,catch(ArithmeticException,e),System.out.println,(,被零除,: + e);,catch(ArrayIndexOutOfBoundsException,e),System.out.println(Array,index out of bound exception: + e);,System.out.println,(,执行,catch,块后的语句块,);,14,6.4,异常处理机制,声明抛弃异常,声明抛弃异常是在一个方法声明中的,throws,子句中指明的,.,包含,throws,子句的方法的基本形式,修饰符,返回类型 方法名,(,参数,1,参数,2,)throws,异常列表,例如,public,int,read () throws,IOException,throws,子句中同时可以指明多个异常,说明该方法将不对这些异常进行处理,而是声明抛弃它们,.,例如,public static void,main(String,args,) throws,IOException,IndexOutOfBoundsException,15,6.5,手动抛弃异常,手动抛弃异常对象是通过,throw,语句实现的,但可以抛弃的异常必须是,Throwable,或其子类的实例,.,其基本形式如下:,throw,异常名,;,throw,关键字主要是用在,try,块中,用来说明已经发生的异常情况,.throw,关键字后面跟随一个从类,Throwable,中派生的异常对象,用来说明发出的异常类型,.throw,语句促使程序立即停止运行,并且重复执行最近能够处理指定对象的,catch,语句,.,如果异常在程序的其他地方产生,throw,语句也可以放在,try,语句的后面,.,为了把异常处理控制传递给更高层的处理模块,还可以对截获的异常对象再一次实施,throw,操作,.,16,6.6,自定义异常,若要建立自己的异常类型,只要定义,Exception,的一个子类就可以了,子类不需要实际执行什么,它们在类型系统中的存在允许把它们当成异常使用,.,自定义异常的基本形式如下所示,:,class,自定义异常,extends,父异常类名,类体,;,17,6.6,自定义异常,例,自定义异常示例,class ExceptionExam7_1 extends Exception,private,int,show;,ExceptionExam7_1 (,int,a),show=a;,public String,toString,(),return ExceptionExam7_1 ;,public class ExceptionExam7,static void,caculate(int,a) throws ExceptionExam7_1,System.out.println,(,对,+ a +,已经进行过相应的操作,);,if(a,100) throw new ExceptionExam7_1 (a);,18,6.6,自定义异常,System.out.println,(,执行该算法正常退出!,);,public static void,main(String,args,),try,caculate(1);,caculate(1000);,catch (ExceptionExam7_1 e),System.out.println,(,捕获了异常, + e);,19,6.7,多线程,程序,:,静态的计算机高级语言编写的代码。,进程,:,程序的一次执行。系统运行程序的基本单位。,线程,:,程序中的部分代码的一次执行过程。,多进程,:,操作系统中多个程序同时执行。,多线程,:,程序中多个片断同时执行。,20,6.8,线程的生命周期,每个,java,程序都有一个主线程,即,main(),方法对应的线程,要实现多线程,必须在主线程中创建新的线程。,Java,中线程用,Thread,类及其子类的对象来表示。每个线程要经过创建、就绪、运行、阻塞和死亡,5,种状态,线程从新生到死亡的状态变化过程称为生命周期:,创建状态,就绪状态,运行状态,阻塞状态,终止状态,21,6.8,线程的生命周期,创建状态,:,用,new,关键字和,Thread,类或其子类建立的一个线程对象后,该线程就处于新生状态,就有自己的内存空间,通过调用,start,方法进入就绪状态。,就绪状态,:,该状态的线程具备了运行条件,但还没有分配到,CPU,,因而将进入线程队列,等待系统为其分配,CPU,。一旦获得,CPU,,线程就进入运行状态并自动调用自己的,run,方法。,运行状态,:,进入运行状态的线程执行自己的,run,方法中的代码,直到调用其他方法而终止、或等待某资源或完成任务而死亡。,22,6.8,线程的生命周期,阻塞状态,:,处于运行状态的线程在某种情况下,如执行了,sleep,方法或等待,I/O,设备等资源,将让出,CPU,并暂时终止自己的运行,进入阻塞状态。在阻塞状态的线程不能进入就绪队列。只有当引起阻塞的原因消除时,如睡眠时间到或等待的,I/O,设备空闲下来,线程便转入就绪状态,重新到就绪队列中排队等待,CPU,资源。当再次获得,CPU,时,便从原来的终止位置开始继续运行。,运行状态,:,当完成工作或被另一个线程强制终止,即死亡。,23,线程状态及状态转换示意图,24,6.9,多线程的实现,自定义线程的创建,声明一个,Thread,类的子类,并,覆盖,run(),方法。,class,mythread,extends Thread,public void run( ) ,/*,覆盖该方法*,/ ,声明一个实现,Runnable,接口的类,并实现,run(),方法。,class,mythread,implements,Runnable,public void run( ),/*,实现该方法*,/ ,25,6.9,多线程的实现,创建线程对象,线程名 对象名,new,线程名,(,实际参数,);,启动,对象名,.start();,运行,对象名,.run();,阻塞,26,6.9,多线程的实现,线程的控制,终止线程,:,stop(),方法。,测试线程状态,:,isAlive,(),方法。,线程的暂停和恢复,:,sleep(m,),现,成停止,m,毫秒再运行,yield()-,暂停当前线程,允许其它县城执行,但该线程处于可运行状态,不进入阻塞状态。,join()-,暂停线程,调用本方法的线程结束后继续执行本线程。,中断线程,:interrupt()-,为当前线程设置中断标志。此时,isInterrupted,(),方法为,true,,在,sleep(),之类的方法中阻塞该线程时会抛出中断异常。,27,6.10,线程的管理,28,线程互斥,:,并发执行的多个线程在某一时间内只,允许一个线程在执行以访问数据。,由于同一进程的多个线程共享同一片存储空间,,在带来方便的同时,也带来了访问冲突这个严重的,问题。,Java,语言提供了专门机制以解决这种冲突,,有效避免了同一个数据对象被多个线程同时访问。,应用的场合,:,当两个或多个线程同时访问共享数据时,可能对,数据进行读、写、修改、删除等操作时,应保证同,时只有一个线程访问共享数据。,6.10,线程的管理,29,线程互斥的实现机制,监视器,(,同步锁定,):,线程进入监视器后其它线程则不能再进入监视器,直到,被锁定的线程退出监视器,下一个线程才能进入监视器被,执行。,如何产生监视器,(,同步互斥方法,):,通过在被多个线,程所共享的方法前加上,synchronized,关键字定义出同步互,斥方法,每一个拥有,synchronized,方法的对象都含有一个,独立的监视器,只有某一个线程的,synchronized,方法执行,完后其它线程的,synchronized,方法才能被执行。,public synchronized void,myFun,(),6.10,线程的管理,30,6.10,线程的管理,同步方法,public,synchronized,返回值类型 方法名,(,参数,),;,31,6.10,线程的管理,同步块,public,返回值类型 方法名,(,参数,),;,synchronized,(this),;,32,Java,提供了一个线程间通信机制,使用,wait(),、,notify(),和,notifyAll,(),方法 。这些方法仅在,synchronized,方法中才能被调用。,wait(),方法告知被调用的线程退出监视器并进入等待状态,直到其他线程进入相同的监视器并调用,notify( ),方法。,notify( ),方法通知同一对象上第一个调用,wait( ),线程。,notifyAll,(),方法通知调用,wait(),的所有线程,具有最高优先级的线程将先运行。,6.10,线程的通信,33,利用,wait(),(,释放同步锁,进入等待队列)、,notify(),(,唤醒等待队列中的第一个线程,并把它移人同步锁申请队,列,),及,notifyAll,(),方法,(,它们只能在,synchronized,同步方法,中被调用,),。,通过使用,wait(),一个线程可以等待对象里的一些条件的改,变,而通过,notify(),和,notifyAll,(),,,一个线程也可以通知等待,对象条件的所有线程,告诉它们条件已经改变,可以继续执,行。通常的一种情况是一个线程产生对象的数据,而另一个,线程使用对象的数据。,6.10,线程的通信,34,小结,JDK API,中定义的系统异常对象类型,JAVA,应用程序中异常的处理方式,创建用户类型异常对象的方法,JVM,的异常对象处理机制,对线程的执行状态进行控制和调整,在一个,Java,程序中创建多个并发执行的线程,将多个并发执行线程进行同步处理,35,作业,完成本章复习题,public class,TestSum,public static void,main(String,args,),Thread1 t1=new Thread1(100);,t1.start();,System.out.println(t1.getSum();,System.out.println(t1.isAlive();,class Thread1 extends Thread,int,n,sum,;,Thread1(int a),n=a;,public void run(),for(int,i=1;i=,n;i,+)sum=,sum+i,;,public,int,getSum,()return sum;,36,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!