欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    JAVA讲义第6章.pdf

    • 资源ID:76239150       资源大小:43.54KB        全文页数:13页
    • 资源格式: PDF        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    JAVA讲义第6章.pdf

    -111-第 6 章 Java异常处理6.1概 述异常就是在程序运行时由代码所产生的不正常状态。换句话说,异常就是一个运行错误。在不支持异常处理的计算机语言中,错误必须被人工进行检查和处理,这显然麻烦而低效。Java语言提供了异常处理机制,为方法的异常终止和出错处理提供了清楚的接口。异常(exception)也是异常事件(exceptional event)的简称,它是在程序运行中出现的违背指定正常流向的事件。许多不同种类的错误可以导致异常,从严重的硬件错误到简单的编程错误。当在 Java方法中发生这样的错误时,方法将创建一个异常对象,并把它交给运行系统处理,运行系统负责找到处理错误的代码并执行之。异常对象包括关于异常的信息、类型和错误发生时程序的状态以及对该错误的详细描述。在 Java中,创建一个异常对象并把它送到运行系统叫做抛出异常。在抛出异常后,运行系统将寻找合适的方法来处理异常。如果产生的异常类与所处理的异常类一致,则认为找到了合适的异常处理方法。如果运行系统找遍了所有方法而没有找到合理的异常处理方法,则运行系统将终止Java程序的运行。异常处理也叫做捕捉异常。Java中的每个异常都是一个对象,它是 java.lang包中 Throwable 类或其子类的实例对象。Throwable 类有两个子类:Exception 类和 Error 类。Exception 类是可以被捕捉并且可能恢复的异常类,也可以继承Exception 类生成自己的异常类。Error 类一般被认为是不可恢复和不可捕捉的异常类。6.2 异常的类型6.2.1异常类的层次结构通过本章的学习,主要了解异常的概念、作用和异常的产生,掌握怎样捕捉异常,怎样创建自己的异常类,以及怎样利用Java开发环境提供的异常类来处理程序中的异常。通过技能训练,掌握 Java语言中异常处理的基本技术。-112-图 6.1异常类的层次java 语言用继承的方式来组织各种异常。所有的异常都是Throwable 类或子类,而Throwable 类又直接继承于object类。Throwable 类有两个子类:Error 类与 Exception 类。Exception 类又进一步细分为RuntimeException(运行异常)类和Non-RuntimeException(非运行异常)类。图6.1 显示了各异常之间的继承关系。如果程序中可能产生非运行异常,就必须明确地加以捕捉并处理,否则就无法通过编译检查。与非运行异常不同的是,错误(Error)与运行异常(RuntimeException)不需要程序明确地捕捉并处理。6.2.2 Exception类及其子类Exception 类分为 RuntimeException(运行异常)类和Non-RuntimeException(非运行异常)类。1.运行异常运行异常表现在Java运行系统执行过程中的异常,它是指Java程序在运行时发现的由 Java解释抛出的各种异常,包括算术异常、下标异常等等。表6-1 列出几种常见的异常。表 6-1几种常见的运行异常异常类名功能说明ArithmeticException除数为零的异常IndexOutOfBoundsException下标越界异常ArrayIndexOutOfBoundsException访问数组元素的下标越界异常StringIndexOutOfBoundsException字符串下标越界异常ClassCaseException类强制转换异常NullpointerException 当程序试图访问一个空数组中的元素,或访问一个空对象中的方法或变量时产生的异常Java.lang.Non_RuntimeException Java.lang.Object Java.lang.Throwable Java.lang.Error Java.lang.Exception 各种错误子类Java.lang.RuntimeException各种运行异常子类各种非运行异常子类-113-2非运行时异常非运行时异常是由编译器在编译时检测是否会发生在方法的执行过程中的异常。非运行异常是Non-RuntimeException 及其子类的实例,可以通过 throws 语句抛出。Java在其标准包 Java.lang、java.util、java.io、中定义的异常类都是非运行异常类。表 6-2列出了常见的非运行异常。表 6-2非运行异常异常类名功能说明ClassNotFoundException指定类或接口不存在的异常IllegalAccessException非法访问异常IOException输入输出异常FileNotFoundException找不到指定文件的异常ProtocolException网络协议异常SocketExceptionSocket操作异常MalformedURLException统一资源定位器(URL)的格式不正确的异常6.2.3 Error类及其子类Error 类定义了正常情况下不希望捕捉的错误。在捕捉Error 子类时要多加小心,因为它们通常在出现灾难性错误时被创建。表6-3 列出一些常见的Error 异常类。表 6-3Error 异常类异常类名功能说明LinkageError动态链接失败VirtualMachineError虚拟机错误AWTError AWT 错误6.3 java异常产生与捕捉6.3.1产生异常通过下面两个引例来认识异常的产生。【引例 1】import java.io.*;class Exception1 public static void main(String args)FileInputStream fis=new FileInputStream(text);int b;-114-while(b=fis.read()!=-1)System.out.print(char)b);fis.close();该引例的第6 行表明在一个文件“text”上建立文件输入流。运行此程序时,如果这个文件并不存在,就会产生异常。另外,第8 行是读此文件的内容,如果该文件不存在,则从此文件中读取数据时,也可能发生异常。【引例 2】class Exception2 public static void main(String args)int a=0,b=0;a=36/b;System.out.println(a=+a);从该引例的第6 行不难看出,除数为零。因此,运行此程序时必然会发生除零溢出的异常事件,使程序无法继续运行。上面的两个引例都有或可能有异常产生。对于一些异常,在程序中必须对它进行处理,否则编译程序时会指出错误,如引例1;但对另一些异常,在程序中可以不做处理,而直接由运行系统来处理,如引例2。6.3.2 捕捉异常一个方法中如果对某种类型的异常对象提供了相应的处理代码,则这个方法就可以捕捉对应的异常。捕捉异常是通过try-catch-finally 语句实现的。其语法为:try 正常程序段,可能抛出异常;catch(异常类 1 异常变量)捕捉异常类 1 有关的处理程序段;catch(异常类 2 异常变量)捕捉异常类 2 有关的处理程序段;-115-,finally 退出异常处理程序段;1.try try 用来监视它所在的程序块是否发生异常,如果发生异常就抛出它。对于系统产生的异常或程序块中未用try 监视所产生的异常,将一律被Java运行系统自动抛出它。2.catch catch用来捕捉 try 程序块所抛出的异常,并根据异常类型采取相应的方法进行处理。每个 try 程序块后面紧接着一个或多个catch 语句,用于捕捉try 程序块中所抛出的一个或多个异常。catch 语句只需要一个形式参数,参数类型给出它能够捕捉的异常类型,这个类必须是Throwable 的子类,运行时系统通过参数值把被抛出的异常对象传递给catch块,在 catch 块中是对异常对象进行处理的代码。【例 6.1】捕捉引例 1 中的异常。import java.io.*;class Exception3 public static void main(String args)try FileInputStream fis=new FileInputStream(text);int b;while(b=fis.read()!=-1)System.out.print(char)b);fis.close();catch(FileNotFoundException e)System.out.println(e);catch(IOException e)System.out.println(e);-116-这里使用了两个catch语句分别对 try 代码块中可能出现的两个异常事件进行处理。第一种情况,如果要打开的文件“text”在当前目录中不存在,程序运行时会抛出一个 FileNotFoundException 异常对象,由于第一个catch 语句与该异常类型匹配,所以程序将执行第一个catch语句,于是就会显示下面的信息:java.io.FileNotFoundException:text(系统找不到指定的文件。)一般地,程序中如果有多个catch语句,那么,若有一个 catch 语句的异常类与抛出的异常对象匹配,那么,此catch 语句将被执行,其他catch语句将被忽略。此例中,由于第一个 catch 语句首先得到匹配,第二个 catch语句将不会被执行。因此,在安排 catch语句的顺序时,首先应该捕捉最特殊的异常,然后再逐渐一般化。通常在指定所捕捉的异常类型时,应该避免选择最一般的类型(如Exception)。否则,当异常事件发生时,程序中不能确切判断异常的具体类型并做出相应处理以从错误中恢复。第二种情况,如果要打开的文件“text”在当前目录中存在,程序的运行结果会显示“text”文件中的内容。3Finally 捕捉异常的最后一步是通过finally 语句为异常处理提供一个统一的出口,使得在控制流转到程序的其他部分以前,能够对程序的状态作统一的管理。不论在try 代码块中是否发生了异常事件,finally 代码块中的语句都会被执行。【例 6.2】finally 语句作用的例子。import java.io.*;class Exception4 public static void main(String args)throws IOException FileInputStream fis=null;try fis=new FileInputStream(text);System.out.println(text 文件的内容是:);int b;while(b=fis.read()!=-1)System.out.print(char)b);catch(FileNotFoundException e)-117-System.out.println(e);catch(IOException e)System.out.println(e);finally if(fis!=null)System.out.println(正在关闭文件.);fis.close();else System.out.println(文件没有打开!);如果要打开的文件“text”在当前目录中不存在,程序的运行结果如下:java.io.FileNotFoundException:text 文件没有打开!这种情况下,finally 语句被执行。如果要打开的文件“text”在当前目录中存在,且“text”文件中的内容为:“let us begin learn java.”,则程序的运行结果如下:text 文件的内容是:let us begin learn java.正在关闭文件.这种情况下,finally 语句仍被执行。4抛出异常:throw throw 语句明确地抛出一个异常。throw 语句的一般格式:throw;其中,必须是 Throwable 类或其子类的一个对象,简单数据类型不能用于异常。throw 语句会中断程序流的执行,其后的语句将不会被执行。系统会检测离throw最近的 try 块,看是否存在与throw 语句抛出的异常类型相匹配的catch 语句。如果找到匹配的 catch 语句,则控制转到catch 语句中。如果没找到,则检测下一个try 块,并且-118-一直检测下去。如果到最后仍没有找到匹配的catch 语句,这个程序将被中断。下面的程序产生并抛出了一个异常,捕捉到这个异常的处理又抛出一个异常到外部调用方法的处理中。【例 6.3】利用 throw 语句抛出异常的例子。public class Exception5 static void demoproc()try throw new NullPointerException(demo);/抛出一个异常 catch(NullPointerException e)System.out.println(捕捉内部异常.);/捕捉 demoproc内部异常throw e;/抛出另一个异常 public static void main(String args)try demoproc();catch(NullPointerException e)System.out.println(再次捕捉异常:+e);/再次捕捉异常 从程序结构中可以看到,main()方法创建了一个异常处理块,在demoproc()方法中创建了另一个异常处理块。所以,这个程序有两次机会处理同一个错误。执行此程序时,首先调用demoproc()方法。在demoproc()中先抛出一个NullPointerException 异常,由demoproc()内部的 catch 语句捕捉到,输出“捕捉内部异常.”字样后,再次抛出一个同样的异常。由于该异常在 demoproc()方法中不能被捕捉到,所以只能被 main()方法中的 catch语句捕捉到并处理之。因此,程序的运行结果如下:捕捉内部异常.再次捕捉异常:java.lang.NullPointerException:demo 5声明抛出异常throws 如果一个方法可能抛出一个异常而它自己又没有处理方法,那么异常处理的任务就-119-交给调用者去完成,此时,必须在方法声明中包括throws 子句,以便该方法的调用者捕捉该异常。一个throws 子句列出了一个方法可能抛出的异常类型。包括Throws 子句的方法声明的一般格式如下:方法名(参数列表)throws 方法体;下面的程序试图抛出一个它不捕捉的异常,因为这个程序没有指定一个throws 子句来声明抛出异常,所以程序不能编译通过。【例 6.4】无声明的抛出异常public class Exception6 static void throwOne()System.out.println(抛出内部异常。);throw new IllegalAccessException(demo);public static void main(String args)throwOne();为了使这个程序编译成功,需要进行两处修改。首先,需要声明方法throwOne()抛出了 IllegalAccessException 异常。然后,必须在main()中定义 try-catch 语句来捕捉这个异常。修改的正确程序如下:【例 6.5】声明抛出异常public class Exception7 static void throwOne()throws IllegalAccessException System.out.println(抛出内部异常。);throw new IllegalAccessException(demo);public static void main(String args)try throwOne();-120-catch(IllegalAccessException e)System.out.println(捕捉到异常为:+e);运行结果如下:抛出内部异常。捕捉到异常为:java.lang.IllegalAccessException:demo 6.3.3创建自己的异常类尽管 Java的内部异常可以处理大多数的一般错误,但有时还要创建自己的异常类型来处理特定的情况。实际上,定义自己的异常类非常简单,只需要定义一个Exception类的子类就可以。Execption 类并没有定义它自己的任何方法,它继承了 Throwable 类提供的方法,所以,任何异常,包括自己建立的异常,都继承了Throwabe 定义的方法,也可以在自定义的异常类中覆盖这些方法中的一个或多个方法。【例 6.6】创建自己的异常类。class MyException extends Exception int num=0;MyException()num+;String show()return 自己的异常,序号为:+num;class DemoExcep static void Demo(int n)throws MyException System.out.println(n=+n);if(n200)System.out.println(没有异常产生!);return;else throw new MyException();-121-public static void main(String args)try Demo(75);Demo(250);catch(MyException e)System.out.println(捕捉到异常为:+e.show();程序运行结果如下:n=75 没有异常产生!n=250 捕捉到异常为:自己的异常,序号为:1 自己所创建的异常类,在使用上和 Java所提供的异常类一样,因此,只要根据前面所介绍的异常使用方法,就可以使用自己创建的异常类了。6.3.4应用实例【例 6.7】多种异常处理的实例。class MultiExcep static void Demo(int n)int a=0,b=0;int arr=new int5;switch(n)case 0:a=38/b;break;case 1:arr17=23;break;public static void main(String args)int i;for(i=0;i2;i+)-122-try System.out.println(i=+i);Demo(i);catch(ArithmeticException e)System.out.println(除数为零异常!);catch(ArrayIndexOutOfBoundsException e)System.out.println(数组下标越界异常:+e);finally System.out.println(执行 finally 代码块!);在 main()方法中循环执行两次,执行第一次循环时,调用 Demo()方法中的第一个分支语句,产生除数为零的异常;执行第二次循环时,调用demo()方法中的第二个分支语句,会产生访问数组元素的下标越界异常。程序运行结果如下:i=0 除数为零异常!执行 finally 代码块!i=1 数组下标越界异常:java.lang.ArrayIndexOutOfBoundsException 执行 finally 代码块!习题6.1列出五种常见的异常。6.2试解释什么是抛出异常、什么是捕捉异常。6.3如果 try 块中没有发出异常,当try 块结束执行时,控制会转移到哪里去?6.4使用 finally 块的主要原因是什么?实训技能训练目的要求:1熟悉 Java语言异常的类型。-123-2熟悉 Java语言异常的产生。3掌握 Java语言异常的处理。技能训练内容:1将例 6.1 输入计算机,在下面三种情况下运行程序。(1)“text”文件不存在,观察运行结果;(2)“text”文件存在,观察运行结果;(3)将两个 catch语句交换位置,观察运行结果并分析原因。2将例 6.2 输入计算机,观察运行结果,并说明finally 语句的作用。3模仿例 6.6 创建一个自己的异常类。4将例 6.7 输入计算机,观察运行结果。

    注意事项

    本文(JAVA讲义第6章.pdf)为本站会员(索****)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

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

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开