Java程序设计案例教程-模块.ppt_第1页
Java程序设计案例教程-模块.ppt_第2页
Java程序设计案例教程-模块.ppt_第3页
Java程序设计案例教程-模块.ppt_第4页
Java程序设计案例教程-模块.ppt_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

,模块五异常处理与多线程设计,目标Java语言支持多线程,所谓线程,指的是程序内部的顺序控制流,线程本身并不是程序,自身不能运行,必须在程序中运行,本模块将介绍线程的构造,以及线程的同步。,学习本模块涉及哪些重要内容?,本模块导读无论使用哪种语言进行程序设计,出错处理是非常重要的一个方面。导致异常发生的原因有很多种,比如数组越界、除数为零、访问的文件不存在等等。Java语言是使用面向对象的方法通过异常进行出错处理的,本模块将介绍什么是异常及如何处理程序中出现的异常。Java语言支持多线程,所谓线程,指的是程序内部的顺序控制流,线程本身并不是程序,自身不能运行,必须在程序中运行,本模块将介绍线程的构造,以及线程的同步。,学习本模块涉及哪些重要内容?,本模块要点理解异常的产生和处理机制掌握如何捕获异常、抛出异常掌握如何构造线程并控制线程的同步,任务一异常的产生和处理机制,知识点详解异常的定义异常就是在程序运行过程中出现的不正常事件,该事件会中断指令的正常执行。异常是程序运行时遇到的任何错误情况或意外行为。下列情况都可以产生异常:程序代码或所调用的代码(如共享库)中有错误,如除数为0;操作系统资源不可用,如试图对只读文件进行写操作;公共语言运行库遇到意外情况(如无法验证代码)等。对于这些情况,应用程序可以对某些错误结果恢复到出错前的状态,而对于另一些错误,则不能恢复。在设计程序时,应考虑到可能出现的异常情况,避免由于异常导致系统崩溃的发生。处理异常情况的能力越强,则说明程序的健壮性越好。,任务一异常的产生和处理机制,知识点详解异常类的类层次在Java语言中异常是一些特殊的类,其层次关系如图所示。所有的异常类都继承于类throwable。异常类整体分为两类,一类继承于类Error,这类异常通常不由程序捕获和处理;另一类继承于Exception,在程序中大量处理的就是这类异常。在这类异常中,还分运行时异常(继承于RuntimeException)和非运行时异常,通常程序中不处理运行时异常,而是把它交给Java运行时系统。除运行时异常的其他继承于Exception的子类是非运行时异常,对于这类异常,如果程序不进行处理,可能会使程序运行得到意想不到的结果,因此Java编译器要求程序必须处理(包括捕获或声明抛弃)这类异常。,任务一异常的产生和处理机制,知识点详解,图5-1异常类的层次关系,任务一异常的产生和处理机制,知识点详解异常的处理机制在Java程序的执行过程中,倘若出现了异常事件,就会生成一个异常对象,该对象可能由Java虚拟机生成,也可能由程序中正在进行的方法生成,包含一些指明异常事件类型和异常发生时程序运行的状态信息。生成的异常对象将传递给Java运行时系统,通常称异常的产生和提交过程为抛出异常,对应的保留字为throw。运行时系统得到异常对象后,就会寻找该异常的代码。系统首先从生成异常对象的代码快开始寻找,接着对方法的栈进行逐层回溯,一直到找到一个能够处理该异常的方法为止,随后,运行时系统把当前异常对象交给寻找到的方法处理,这个过程通常称为异常的捕获,对应的关键字为catch。如果Java运行时系统没有找到可以处理该异常的方法,运行时系统就会终止运行,运行的Java程序就会随之退出运行。,任务一异常的产生和处理机制,知识点详解例如:算术运算异常(由除0错误导致)完整的程序代码如下:classTestpublicintdevide(intx,inty)intresult=x/y;returnresult;classExceptionTest1publicstaticvoidmain(Stringargs)newtext().devide(3,0);【1】System.out.println(programisrunninghere!);,任务一异常的产生和处理机制,知识点详解代码详解【1】/*调用类Test对象的devide方法,并向形参x、y传递实参:3、0,传递的参数除数为0*/例题中由于main函数中【1】语句向“intresult=x/y;”语句传递的参数y=0,即除数为0,导致程序运行时出现异常。屏幕上出现如下信息:Exceptioninthread“main”java.lang.ArithmeticException:/byzeroatText.decide(ExceptionTest1.java:5)atExceptionText1.main(ExceptionTest1.java:14)其中,“ArithmeticException”类为算术运算异常类,出现异常后,程序无法继续进行。,任务二异常捕获,知识点详解【案例】试题选择时异常的捕获实现该案例的代码段如下:tryif(in!=null,任务二异常捕获,知识点详解correctAnswer=(read.readLine().trim();Stringtemp=(read.readLine().trim();StringTokenizertoken=newStringTokenizer(temp,:);inthour=Integer.parseInt(token.nextToken();intminute=Integer.parseInt(token.nextToken();intsecond=Integer.parseInt(token.nextToken();time=1000*(second+minute*60+hour*60*60);catch(Exceptione)【1】testContent=没有选择试题;【2】,任务二异常捕获,知识点详解代码详解程序中字符“e”指异常对象,可以用任意标识符表示,但通常习惯用字母“e”表示。给出处理try代码块中所生成的异常事件的方法,运行时屏幕会显示出发生了怎样的异常情况。catch中的这条语句可以省略,不影响程序的继续运行,但不利于提醒用户及时发现程序中出现了怎样的异常情况。捕获异常下面介绍如何捕获异常。即try代码块中抛出了一个异常,接着利用catch语句输出一些与该异常相关的信息。捕获异常就是在某个方法中对某种类型的异常对象提供了相应的处理方法,捕获异常是通过try-catch-finally语句来实现的,该语句的格式如下:,任务二异常捕获,知识点详解trycatch(ExceptionType1exceptionobject)catch(ExceptionType2exceptionobject)finally,任务二异常捕获,知识点详解下面介绍try-catch-finally语句各部分的用法。Trytry代码块选定捕获异常的范围,try代码块所限定的语句在执行过程中可能会生成异常对象并抛出异常对象。Catchcatch语句用于处理try代码块中所生成的异常事件,而且catch语句可以是多个,catch语句带有一个形式参数,参数类型指明能够捕获的异常类型,该异常类型必须是Throwable类的子类,程序运行时,系统就会通过参数值把被抛出的异常对象传递给catch代码块。Finallyfinally语句为异常处理提供一个统一的出口,不管try代码块中是否发生了异常事件,finally块中的语句都会被执行。,任务二异常捕获,知识点详解抛出异常例如:抛出异常的声明访问不存在的文件。完整的程序代码如下:importjava.io.*;classExceptionTest3publicstaticvoidmain(Stringargs)throwsIOException/*throws关键字抛出异常*/FileInputStreamstreamobj=newFileInputStream(“readme.txt);System.out.println(“programisrunninghere!”),任务二异常捕获,知识点详解信息卡异常类“IOException”为输入输出异常,是异常类“Exception”的子类。通过throws语句声明抛出异常,这样就不用在main方法中用catch语句捕获异常,但需要注意,要想上面的程序能够运行通过,需要保证当前路径下存在readme.txt文件。如果文件不存在,throws语句只能使程序通过编译,而不能通过运行。声明抛出异常就是在方法声明中通过throws子句指明,格式如下:returntypemethodName()throwsExceptionName其中,returntype是方法的返回类型,methodName为方法的名称,ExceptionName为抛出的异常类型。,任务二异常捕获,知识点详解完整的程序代码如下:classTest4publicintdevide(intx,inty)throwsExceptionif(y0)thrownewDevide2(“devideis”+y);【4】intresult=x/y;returnresult;classDevide2extendsException【1】publicDevide2(Stringmsg)【2】super(msg);【3】,任务二异常捕获,知识点详解classExceptionTest1publicstaticvoidmain(Stringargs)trynewTest().devide(3,2);catch(exceptione)【5】System.out.println(e.getMessage();System.out.println(“programisrunninghere!”),任务二异常捕获,知识点详解代码详解自定义异常类型,类名为Devide2,自定义的异常类必须继承Execption类。异常类的构造方法,这个方法接受一个字符串。调用父类的构造函数。生成自己的异常对象,并抛出这个异常。根据抛出的异常,生成异常对象e,并通过try-catch语句捕获住异常。屏幕显示运行结果:devideis2。,任务三多线程设计,子任务1线程体的构造知识导读【案例】线程体的构造、启动与访问当前线程对象名完整的程序代码如下:classTestThread5publicstaticvoidmain(Stringargs)minthreadtt=newminthread();【2】tt.start();【3】while(true)System.out.println(“main():”+Thread.currentThread().getname();【5】,任务三多线程设计,子任务1线程体的构造知识导读classminthreadextendsThread【1】publicvoidrun()【4】while(true)System.out.println(“Run():”+Thread.currentThread().getname();,任务三多线程设计,子任务1线程体的构造知识导读程序运行结果显示:main():mainRun():Thread-1Run():Thread-1两个System.out.println()语句的内容无规则交替打印输出,说明启动了两个线程,一个是main方法的内容,一个是run方法的内容。,注意,任务三多线程设计,子任务1线程体的构造知识导读代码详解Java的线程是通过java.lang软件包中的Thread类来实现的,可以通过minthread类继承了Thread类,为Thread类的子类。创建一个minthread子类的对象tt。对象tt通过start()方法启动线程。minthread()子类重写Thread类的Run()方法。currentThread()方法用来返回一个线程类的对象,getname()获取对象的名称。,任务三多线程设计,子任务1线程体的构造知识点详解多线程概述线程的定义:线程与进程相似,是一个执行的程序,是程序中单个顺序的流控制:但与进程不同的是,同类的多个线程(multithread)是共享一块内存空间和一组系统资源的,而线段本身的数据通常只有微处理器的寄存器数据,以及一个供程序执行时使用的堆栈。所以系统在产生一个线程,或者在各个线程之间切换时,负担要比进程小的多,正因为如此,线段被称为轻负荷进程。一个进程4呵以包含多个线程。单线程与多线程有什么区别呢?,任务三多线程设计,子任务1线程体的构造知识点详解以上例为例,如果类minthread不是类Thread的子类,同时main函数中不用tt.start();语句启动另一个线程,而直接用newminthread().run();语句调用run()方法,由于run()方法中的while()循环的条件永远为true,因此,程序一直执行run()中的循环语句,而无法执行main函数System.out.println(“main():”+Thread.currentThread().getname();语句,此为单线程;而上例中Java的线程是通过java.lang软件包中的Thread类来实现的,通过minthread类继承了Thread类,为Thread类的子类,同时通过start()方法启动了新线程,因此,两个线程无规则交替使用,此为多线程。,任务三多线程设计,子任务1线程体的构造知识点详解用Thread类创建线程要将一段代码在一个新的线程上运行,该代码应该在一个类的run函数中,并且run函数所在的类是Thread类的子类。即:要实现多线程,必须编写一个继承了Thread类的子类,子类要覆盖Thread类中的run函数,在子类的run函数中调用想在新线程上运行的程序代码。启动一个新的线程,我们不是直接调用Thread的子类对象的run方法,而是调用Thread类对象的start方法将产生一个新的线程,并在该线程上运行该Thread类对象中的run方法。,任务三多线程设计,子任务1线程体的构造知识点详解格式如下所示:ThreadcountTime=newThread(this);/含义是创建一个线程对象countTime,Thread类从this所指的对象中获得run方法。countTime.start();/启动该线程,任务三多线程设计,子任务1线程体的构造知识点详解【案例】Runnable接口构造线程。完整的程序代码如下:classTestThread6publicstaticvoidmain(Stringargs)Threadtt=newThread(newminthread();【2】tt.start();while(true)System.out.println(“main():”+Thread.currentThread().getname();,任务三多线程设计,子任务1线程体的构造知识点详解classminthreadimplementRunnable【1】publicvoidrun()while(true)System.out.println(“run():”+Thread.currentThread().getname();,任务三多线程设计,子任务1线程体的构造知识点详解这是实现线程体的另一种构造方法,不调用Thread中的run方法,而是调用Runnable中的run方法作为线程的执行代码。程序运行结果与前一案例中创建Thread类子类对象执行线程并无差别。,注意,任务三多线程设计,子任务1线程体的构造知识点详解代码详解提供一个实现Runnable接口的类作为线程的目标对象。创建线程对象,并传递了一个Runnable类型的线程对象。通过实现Thread类的子类,重写继承的run方法定义线程体,然后创建该子类的对象创建线程。例如:publicclassMyThreadextendsThreadpublicrun()System.out.println(MyThread.run();,任务三多线程设计,子任务1线程体的构造知识点详解在合适的地方启动线程:newMyThread().start();由于Java只支持单重继承,用这种方法定义的类不能再继承其他父类。如果自己的类已经extends另一个类,就无法直接extendsThread,此时,必须实现一个Runnable接口:publicclassMyThreadextendsOtherClassimplementsRunnablepublicrun()System.out.println(MyThread.run();,任务三多线程设计,子任务1线程体的构造知识点详解通过在类中实现Runnable接口,并在该类中提供run()方法的实现,用这种方法定义的类可以再继承其他父类。,任务三多线程设计,子任务2线程的同步知识点详解【案例】存取数据的部分代码。完整的程序代码如下:classAprivateints;privatebooleanbflag=false;publicsynchronizedintget()while(bflag=false)try,任务三多线程设计,子任务2线程的同步知识点详解wait();/等待put中调用notify()catch(InterruptedExceptione)bflag=false;notify();returns;publicsynchronizedintput(intvalue)while(bflag=true),任务三多线程设计,子任务2线程的同步知识点详解trywait();/等待get中调用notify()catch(InterruptedExceptione)s=valuebflag=true;notify();,任务三多线程设计,子任务2线程的同步知识点详解在Java语言中,提供了关键字synchronized为同步语

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论