




已阅读5页,还剩51页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章异常处理与多线程,内容提要:Java异常异常的处理线程概念线程的创建线程的状态与控制线程的优先级、调度和管理线程组线程的同步,异常处理,Java异常的概念和处理机制Java异常的分类异常的捕获、处理和抛出使用用户自定义异常,8.1Java异常,Java程序运行过程中所发生的异常事件可分为两类:错误(Error):JVM系统内部错误、资源耗尽等严重情况异常(Exception):其它因编程错误或偶然的外在因素导致的一般性问题,例如:对负数开平方根空指针访问试图读取不存在的文件网络连接中断,Java异常举例(1),程序名称:ExceptionTest1.javapublicclassExceptionTest1publicstaticvoidmain(Stringargs)Stringname=Bill,Bob,David;for(inti=0;i5;i+)System.out.println(namei);System.out.println(n+thisistheend);,异常处理举例(1),程序ExceptionTest1.java运行结果:,常见异常,RuntimeException错误的类型转换数组下标越界空指针访问IOExeption从一个不存在的文件中读取数据越过文件结尾继续读取连接一个不存在的URL,8.1.2异常处理机制,Java程序的执行过程中如出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统,这个过程称为抛出(throw)异常。当Java运行时系统接收到异常对象时,会寻找能处理这一异常的代码并把当前异常对象交给其处理,这一过程称为捕获(catch)异常。如果Java运行时系统找不到可以捕获异常的方法,则运行时系统将终止,相应的Java程序也将退出。程序员通常只能处理异常(Exception),而对错误(Error)无能为力,Java异常类层次,Java异常举例(2),publicclassExceptionTest2publicstaticvoidmain(Stringargs)Stringname=Bill,Bob,David;tryfor(inti=0;i5;i+)System.out.println(namei);catch(java.lang.ArrayIndexOutOfBoundsExceptione)System.out.println(错误类型:下标越界);System.out.println(thisistheend);,异常处理举例(2),程序ExceptionTest1.java运行结果:,8.2异常的处理,如果发生了运行时错误,运行时系统就会产生一个与该错误相对应的异常类对象,Java为它提供了默认的异常处理程序。当程序在运行时产生了非运行时错误,则有两种处理方式:一种方式是自己处理,使用try-catch-finally语句来捕获并处理异常对象另一种方式是方法不需要处理它生成的异常,而是向上传递,由调用它的方法来处理,使用throw语句声明它可以抛出的异常,而不捕捉它们。,8.2.1捕获异常,捕获异常是通过try-catch-finally语句实现的。try./可能产生违例的代码catch(ExceptionName1e)./当产生ExceptionName1型违例时的处置措施catch(ExceptionName2e)./当产生ExceptionName2型违例时的处置措施finally./无条件执行的语句,捕获异常,try捕获异常的第一步是用try语句块选定捕获异常的范围。catch在catch语句块中是对异常对象进行处理的代码,每个try语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的异常对象。与其它对象一样,可以访问一个异常对象的成员变量或调用它的方法。getMessage()方法,用来得到有关异常事件的信息printStackTrace()用来跟踪异常事件发生时执行堆栈的内容。,捕获异常,finally捕获异常的最后一步是通过finally语句为异常处理提供一个统一的出口,使得在控制流转到程序的其它部分以前,能够对程序的状态作统一的管理。不论在try代码块中是否发生了异常事件,finally块中的语句都会被执行。finally语句是任选的,IOException异常处理举例(1),importjava.io.*;publicclassExceptionTest4publicstaticvoidmain(Stringargs)FileInputStreamin=newFileInputStream(myfile.txt);intb;b=in.read();while(b!=-1)System.out.print(char)b);b=in.read();in.close();,IOException异常处理举例(2),程序ExceptionTest4.java编译结果:,8.2.3声明异常,声明抛出异常是Java中处理异常的第二种方式如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理声明抛出异常:publicvoidreadFile(Stringfile)throwsFileNotFoundException/读文件的操作可能产生FileNotFoundException类型的违例FileInputStreamfis=newFileInputStream(file);.,声明抛出举例,importjava.io.*;publicclassExceptionTest5publicstaticvoidmain(Stringargs)ExceptionTest5t=newExceptionTest5();tryt.readFile();catch(IOExceptione)System.out.println(e.getMessage();publicvoidreadFile()throwsIOExceptionFileInputStreamin=newFileInputStream(myfile.txt);intb;b=in.read();while(b!=-1)System.out.print(char)b);b=in.read();in.close();,声明抛出举例,程序ExceptionTest5.java运行结果:,8.2.3抛出异常,Java异常类对象除在程序执行过程中出现异常时由系统自动生成并抛出,也可根据需要需要人工创建并抛出首先要生成异常对象,然后通过throw语句实现抛出操作(提交给Java运行环境)。IOExceptione=newIOException();throwe;可以抛出的异常必须是Throwable或其子类的实例。下面的语句在编译时将会产生语法错误:thrownewString(wanttothrow);,抛出异常举例,importjava.io.*;publicclassTestthrowstaticvoidreadArray(inta,intb)throwsArrayIndexOutOfBoundsExceptionif(ab)thrownewArrayIndexOutOfBoundsException(很可惜超过数组范围!);elseintarray=newinta;arrayb=4;System.out.println(数组赋值成功!);publicstaticvoidmain(Stringargs)tryreadArray(5,4);readArray(4,5);catch(ArrayIndexOutOfBoundsExceptione)System.out.println(异常提示:+e.getMessage();,抛出异常举例,程序Testthrow.java运行结果:,8.2.4重载方法声明抛出异常原则,重写方法不能抛出比被重写方法范围更大的异常类型,publicclassApublicvoidmethodA()throwsIOExceptionpublicclassB1extendsTestApublicvoidmethodA()throwsFileNotFoundExceptionpublicclassB2extendsTestApublicvoidmethodA()throwsException,8.2.5自定义异常类,用户自定义异常类MyException,用于描述数据取值范围错误信息:classMyExceptionextendsExceptionprivateintidnumber;publicMyException(Stringmessage,intid)super(message);this.idnumber=id;publicintgetId()returnidnumber;publicclassExceptionUserpublicvoidregist(intnum)throwsMyExceptionif(num0),8.2.5自定义异常类,System.out.print(登记人数+num);thrownewMyException(人数为负值,不合理,3);publicvoidmanager()tryregist(-100);catch(MyExceptione)System.out.print(登记失败,出错种类+e.getId();System.out.print(本次登记操作结束);publicstaticvoidmain(Stringargs)ExceptionUsert=newExceptionUser();t.manager();,8.3线程概念,线程是一个程序内部的顺序控制流。线程和进程每个进程都有独立的代码和数据空间(进程上下文),进程切换的开销大。线程:轻量的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小。多线程:在同一应用程序中有多个顺序流同时执行多任务:在操作系统中能同时运行多个任务(程序),8.3.2Java对多线程的支持,Java的线程是通过java.lang.Thread类来实现的。每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。,8.4线程的创建-通过实现Runnable接口,classTestThread2publicstaticvoidmain(Stringargs)Athreada=newAthread();Threadt=newThread(a);t.start();classAthreadimplementsRunnablepublicvoidrun()for(inti=0;i5;i+)System.out.println(IamB+i);,8.4线程的创建-继承Thread类,classTestThread1staticAThreadaThread;publicstaticvoidmain(Stringargs)aThread=newAThread();/创建线程。aThread.start();/线程开始运行后classAThreadextendsThreadpublicvoidrun()for(inti=0;i=2;i+)System.out.println(IamA+i);trysleep(600);catch(InterruptedExceptione),两种创建线程方法的比较,使用Runnable接口可以从其他类继承;保持程序风格的一致性。直接继承Thread类不能再从其他类继承;编写简单,可以直接操纵线程,无需使用Thread.currentThread()。,8.5线程的状态与控制,在生命周期中,一个线程具有创建、就绪状态、运行状态、阻塞和终止状态五种状态,Thread类中的方法可以改变线程的状态。,8.5线程的状态与控制,线程控制基本方法,改变线程状态,使用start()方法启动线程启动线程是使线程进入到就绪状态,并不一定立即开始执行该线程使用sleep()方法使线程进入阻塞状态,即线程暂时不再继续执行。睡眠时间过后再进入就绪状态。,线程状态转换举例,publicclassTestThread3publicstaticvoidmain(Stringargs)Athreadr=newAthread();Threadt=newThread(r);t.start();classAthreadimplementsRunnablepublicvoidrun()for(inti=0;i5;i+)if(i%2=0,join方法用法举例,publicclassTestThread5publicstaticvoidmain(Stringargs)Athreada=newAthread();Threadt=newThread(a);t.start();tryt.join();catch(InterruptedExceptione)for(inti=0;i3;i+)System.out.println(main主线程:+i);classAthreadimplementsRunnablepublicvoidrun()for(inti=0;i3;i+)System.out.println(Athread线程:+i);,8.6线程的优先级、调度和管理,线程的优先级用数字来表示,范围从1到10,一个线程的缺省优先级是5Thread.MIN_PRIORITY=1Thread.MAX_PRIORITY=10Thread.NORM_PRIORITY=5使用下述线方法获得或设置线程对象的优先级intgetPriority();voidsetPriority(intnewPriority);,线程的调度,Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程。线程调度器按照线程的优先级决定应调度哪些线程来执行。setPriority(int)方法设置优先级多数线程的调度是抢先式的。时间片方式非时间片方式,下面几种情况下,当前线程会放弃CPU:线程调用了yield(),sleep()方法主动放弃;由于当前线程进行I/O访问,外存读写,等待用户输入等操作,导致线程阻塞;为等候一个条件变量,线程调用wait()方法;抢先式系统下,有高优先级的线程参与调度;时间片方式下,当前时间片用完,有同优先级的线程参与调度。,线程的调度,8.7线程组,在Java中,每个线程都是一个线程组的成员,线程组把多个线程集合为一个对象.java.lang包中ThreadGroup类实现了对线程组的创建和对线程组的操作.对线程组的操作就是对线程组中所有成员的操作。在Java应用程序中,最高层的线程组是main。Java允许我们对一个线程组中的所有线程同时进行操作。,8.7.2线程组的创建,创建线程组有两种方法:(1)创建一个名字为name的线程组。publicThreadGroup(Stringname);(2)在线程组parent中创建一个线程组name。publicThreadGroup(ThreadGroupparent,Stringname);,8.7.3线程组的属性,1线程组的名字publicfinalStringgetName();/返回线程组的名称2线程组的父类publicfinalThreadGroupgetParent();/返回线程组的父类3线程组的优先级publicfinalvoidgetMaxPriority();/返回线程组的最大优先级publicfinalvoidsetMaxPriority(intn);/设置线程组的最大优先级,8.7.4线程组的管理,(1)返回当前线程组中活动线程的个数publicintactiveCount();(2)将当前线程组中活动的线程复制到线程数组或线程组数组中。publicintenumerate(Threadlist),8.8线程的互斥与同步,在Java语言中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。关键字synchronized来与对象的互斥锁联系。当某个对象用synchronized修饰时,表明该对象在任一时刻只能由一个线程访问。,关键字synchronized,关键字synchronized用法举例,publicvoidpush(charc)synchronized(this)dataidx=c;idx+;publiccharpop()synchronized(this)idx-;returndataidx;,关键字Synchronized,synchronized除了象上面放在对象前面限制一段代码的执行外,还可以放在方法声明中,表示整个方法为同步方法。publicsynchronizedvoidpush(charc)如果synchronized用在类声明中,则表明该类中的所有方法都是synchronized的。publicsynchronizedclassStack,实现多线程的同步,classSyncStack/支持多线程同步操作的堆栈的实现privateintindex=0;privatechardata=newchar6;publicsynchronizedvoidpush(charc)while(index=data.length)trythis.wait();catch(InterruptedExceptione)this.notify();dataindex=c;index+;publicsynchronizedcharpop()while(index=0)trythis.wait();catch(InterruptedExceptione)this.notify();index-;returndataindex;,生产者-消费者问题,生产者:Consumer.java消费者:Producer.java栈:SyncStack.java主程序:SyncTest.java,生产者-消费者问题(1),classProducerimplementsRunnable/生产者SyncStackstack;publicProducer(SyncStacks)stack=s;publicvoidrun()for(inti=0;i3;i+)charc=(char)(Math.random()*26+A);stack.push(c);System.out.println(生产:+c);tryThread.sleep(int)(Math.random()*100);catch(InterruptedExceptione),classConsumerimplementsRunnable/消费者:SyncStackstack;publicConsumer(SyncStacks)stack=s;publicvoidrun()for(i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年无人机驾驶员职业技能考核试卷及答案(无人机操作规范与要求)
- 宫腔粘连考试试题及答案
- 设备人员面试题目及答案
- 飞机训练考试题及答案
- 2025年CAAC执照理论复习考试总题库及答案
- 高利贷借款合同模板全套(3篇)
- 房屋买卖双方签订的带抵押的正式协议
- 出纳岗位安全责任聘用合同
- 创新型农业技术研发成果转化合作补充合同
- 个体户食品加工厂员工劳动合同范本
- JGT366-2012 外墙保温用锚栓
- 《动物比较生理学》课件
- 火龙罐综合灸疗法
- 化学锚栓承载力计算
- 肺部感染性疾病课件
- 医院健康体检表
- 肌肉工作原理
- 液体外渗的处理ppt
- 2016火力发电机组及蒸汽动力设备水汽质量
- 市政排水管网施工方案
- 2023年6月浙江省大学英语三级考试真题试卷
评论
0/150
提交评论