单元7 异常处理_第1页
单元7 异常处理_第2页
单元7 异常处理_第3页
单元7 异常处理_第4页
单元7 异常处理_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

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

文档简介

单元7异常异常的概述异常的分类异常的捕获异常的抛出自定义异常异常可以提高程序的交互性,是在程序出现问题时,终止程序运行,避免扩大影响范围。本单元重点介绍Java的异常的概念、异常的处理机制、异常的捕获与处理以及自定义异常。单元七异常教学目标知识目标:技能目标:素养目标:掌握异常的捕获与处理理解异常的概念和异常的处理机制熟悉自定义异常能够恰当运用异常的捕获和处理技术能够正确使用自定义异常能够独立完成拓展任务懂得人无完人、金无足赤的道理具备知错就改、善莫大焉的美德7.1知识储备–异常的概述异常(Exception)是指在程序运行的过程中,可能发生的非正常现象,如果不处理,程序将被终止。在Java中异常产生的原因有三种,一是Java虚拟机产生的异常,即Java内部错误发生的异常;二是程序代码中的错误引起的异常,例如数组的索引越界异常(ArrayIndexOutofBoundsException);三是调用某些方法时,必须处理的异常,例如实例化字节输入流FileInputStream对象时,需要在方法调用处抛出异常,或者在方法体内捕获异常,否则程序无法编译成功。7.1.1异常的概述Java提供了异常类和异常处理机制帮助程序员检查可能出现的异常,异常处理机制是指当程序出现异常时,采取的处理方法,它能让程序发生异常时,按照代码的预先设定的异常处理逻辑,有针对性地处理异常,让程序尽最大可能恢复正常并继续执行,从而提高程序的健壮性。Java的异常处理有5个关键字,分别为try、catch、throw、throws和finally。trycatch语句用于捕获并处理异常,finally语句用于在任何情况下(除特殊情况外)都必须执行的代码,throw语句用于拋出异常,throws语句用于声明可能会出现的异常。7.1.1异常的概述在Java中,Throwable类是的所有错误类Error和异常类Exception的父类。错误是Java运行时系统的内部错误和资源耗尽错误,这种错误是程序无法处理的,通常不需要程序员关心。异常分为运行时异常和非运行时异常两种,运行时异常通常是程序员失误引起的,是可以避免和处理的;非运行时异常是必须进行捕获或者抛出处理的,否则编译无法通过。Throwable类的组织结构如图7-1所示。7.1.1异常的概述7.1知识储备–异常的分类ThrowableErrorException非运行时异常RuntimeExceptionArrayIndexOutOfBoundsException

ArithmeticException

IOExceptionSQLExceptionClassNOtFoundException

IllegalArgumentException

MissingResourceExceptionNullPointerExceptionUnkownTypeException其他子类StackOverflowErrorNoClassDefFoundError

其他子类其他子类7.1.2异常的分类1. 常见错误Error(1)NoClassDefFoundError:找不到类定义错误(2)StackOverflowError:无限递归导致栈空间用尽错误(3)OutOfMemoryError:内存溢出错误2. 常见非运行时异常(1)SQLException:操作数据库异常(2)IOException:IO操作异常7.1.2异常的分类1. 常见错误Error(1)NoClassDefFoundError:找不到类定义错误(2)StackOverflowError:无限递归导致栈空间用尽错误(3)OutOfMemoryError:内存溢出异常2. 常见非运行时异常(1)SQLException:操作数据库异常(2)IOException:IO操作异常7.1.2异常的分类常见运行时异常RuntimeExceptionArrayIndexOutOfBoundsException:数组索引越界异常ArithmeticException:算术异常ClassCastException:类型强制转换异常ClassNOtFoundException:找不到类异常MissingResourceException:缺少资源异常7.1.2异常的分类NullPointerException:空指针异常IllegalArgumentException:传递非法参数异常IndexOutOfBoundsException:某种类型索引越界异常NumberFormatException:数字格式异常UnkownTypeException:不可识别类型异常7.1.2异常的分类Throwable类常用的方法StringgetMessage()--返回该错误的详细信息的字符串。StringtoString()--返回一个对这个异常的简短描述。voidPrintStackTrace()--将栈轨迹信息打印到标准错误输出流上。7.1.2异常的分类package.cvit;

/**

*无限递归导致的堆栈耗尽错误

*/

publicclassErrorDemo{

//定义test()方法,实现无限递归调用

publicstaticvoidtest(inti){

if(i==0){

return;

}else{

test(i);

}

}

publicstaticvoidmain(String[]args){

//在main()方法中调用test()方法

test(5);

}

}

7.1.2异常的分类运行结果:

7.1.2异常的分类提示:例题中的资源耗尽错误是没有办法通过异常处理机制来跳过的。main方法调用test()方法时,传递的实参非零,即会发生无限递归。7.1知识储备–异常的捕获一般格式使用说明案例Java语言通过面向对象的方法来处理异常。如果一个方法在运行过程中发生了异常,会产生一个异常类对象代表该异常,并将异常类对象交给运行时系统,运行时系统寻找相应的代码来处理这一异常。Java运行时异常处理方法分为两种,一是捕获异常,二是抛出异常。捕获异常是指在方法体内将可能发生异常的代码块,用try…catch语句进行处理,抛出异常是指在方法声明中使用throws关键字将异常抛出,由方法的调用者来处理。7.1.3异常的捕获1.捕获异常一般格式try{语句块; //可能出现异常的代码块}catch(异常类型异常对象){

异常处理语句块;}catch(异常类型异常对象){

异常处理语句块;}……finally{

语句块; //通常为关闭资源代码}7.1.3异常的捕获2.使用说明(1)try块将可能发生异常的代码块包围起来,即将这个代码段放在try块的大括号内,在程序执行过程中,try块中任意一条语句发生异常,都会跳过try块中异常后面的语句,并根据异常类型,执行相应的catch块。(2)catch块中的异常类型,可以是异常大类型Exception,也可以是精确定位到具体的异常类,例如,如果可能发生算术异常,可以使用算术异常类ArithmeticExcepiton,也可以使用Excepiton类。(3)在捕获异常语句中,可以有一个或多个catch块。在通常情况下,如果try块被执行一次,只有一个catch块会被执行,不能有多个catch块被执行。(4)当Java运行时环境接收到异常对象后,会依次判断该异常对象是否是catch块后异常类或其子类的对象,如果是,Java运行时环境将调用该catch块来处理该异常;否则再次与下一个catch块的异常类进行比较。(5)finally块可以缺省,该块主要作用是无论程序是否有异常,该块内代码都会被执行,因此,finally块通常用于释放资源。7.1.3异常的捕获【例7-2】除数为0的异常处理。操作步骤:(1)在.cvit包下创建类TryCatchException。(2)在TryCatchException类中,定义main方法。(3)文本编辑器视图中,撰写代码如下:7.1.3异常的捕获package.cvit;

/**

*除数为零的异常

*/

publicclassTryCatchException{

publicstaticvoidmain(String[]args){

intx=10,y=2,result;

try{

//trycatch语句快捷键为ctrl+alt+t

result=x/y;

System.out.println(x+"/"+y+"="+result);

}catch(Exceptione){

System.out.println("除数不能为0");

}

System.out.println("程序结束!!!");

}

}

7.1.3异常的捕获(4)在文本编辑器视图中,单击运行“”按钮,运行程序,结果如图7-2所示。7.1.3异常的捕获运行结果:

提示:如果对result=x/y;这条语句不使用异常捕获处理,则无法执行发生异常后面的语句,即无法执行System.out.println("程序结束!!!");语句的,如图7-3所示。7.1.3异常的捕获trycatch语句捕获异常后,被捕获部分无异常,程序可正常运行,例如除数2时,可显示正常结果,如图7-4所示。7.1.3异常的捕获7.1知识储备–异常的抛出一般格式使用说明案例Java中的异常处理除了捕获处理之外,还可以拋出异常,由方法调用者进行异常处理。抛出异常的关键字是throws。1.抛出异常的一般格式[修饰符]返回值类型方法名(形参列表)throws异常类型1,异常类型2,……,异常类型n{//程序代码}2.使用说明(1)关键字throws后面的异常类型可以是具体类型,也可以是异常类的父类型Exception。(2)在方法声明中抛出异常后,调用该方法的调用处必须进行异常处理,否则报错。7.1.4异常的抛出【例7-3】除数为0异常抛出处理。操作步骤:(1)在包.cvit下创建类ThrowsExcepiton。(2)在ThrowsExcepiton类中,定义main方法。(3)文本编辑器视图中,撰写代码如下:7.1.4异常的抛出package.cvit;

importjava.io.FileInputStream;

publicclassThrowsExcepiton{

//定义除法方法divide(intx,inty)

publicstaticintdivide(intx,inty)throwsException{

//抛出异常,告之调用者可能有异常,需要处理

returnx/y;

}

publicstaticvoidmain(String[]args){

//定义main()方法

inta=100,b=20,result;

try{

//捕获处理divide(intx,inty)中自带的异常

result=divide(a,b);

System.out.println(a+“/”+b+“=”+result);

System.out.println(“try块...”);

}catch(Exceptione){

System.out.println(“catch块...”);

e.printStackTrace();

//输出异常的轨迹

}finally{

System.out.println("finally块...");

}

System.out.println("程序结束!!!");

}

}7.1.4异常的抛出7.1.4异常的抛出(4)在文本编辑器视图中,单击运行“”按钮,运行程序,结果如图7-5所示。

运行结果:

7.1.4异常的抛出提示:当程序可能出现异常,却不确定异常类型时,可以使用Exception异常类,同时可以使用throws关键字在方法声明处抛出异常,由调用者进行异常处理。当程序发生异常时,一定会执行catch块,当程序正常运行时,不执行catch块,例如,除数为20时,运行结果如图7-6所示。如果有finally块,无论程序是否正常运行,均会执行finally块。7.1.4异常的抛出7.1知识储备–自定义异常一般格式使用说明案例Java虽然提供了大量的内置异常处理类,但有时也无法完全满足用户的需求,此时,可以通过自定义异常来弥补这一点,自定义异常类需要继承Exception类或其子类。1. 自定义异常的一般格式Class自定义异常名extendsException类或其子类{ //异常类代码}7.1.5自定义异常2. 使用说明(1)自定义异常类一般包含两个构造方法:一个是无参的默认构造方法,另一个是有参构造方法,参数为字符串型的异常消息,并调用父类构造方法。(2)自定义异常类命名通常按照命名规范命名,例如XXXException,XXX代表异常的作用。7.1.5自定义异常【例7-4】加数与被加数均不能为负数的自定义异常类的使用。操作步骤:(1)在包.cvit下创建类ScoreException。(2)在ScoreException.java文件中,创建自定义异常类,非法成绩异常类IllegalScoreException。(3)在ScoreException类中,定义检查成绩方法checkScore和main方法。(4)文本编辑器视图中,撰写代码如下:7.1.5自定义异常package.cvit;

importjava.util.Scanner;

//自定义IllegalScoreExceptio异常类,继承Exception类

classIllegalScoreExceptionextendsException{

publicIllegalScoreException(){

//继承Exception类的无参构造方法

super();

}

publicIllegalScoreException(Stringmessage){

//继承Exception类的有参构造方法

super(message);

}

}7.1.5自定义异常publicclassScoreException{

//成绩异常类ScoreException

publicstaticintcheckScore(intscore)throwsIllegalScoreException{

//定义checkScore方法,抛出自定义异常类

if(score<0){

//成绩非法时,分别抛出自定义异常类信息

thrownewIllegalScoreException("成绩不能为负数。");

}elseif(score>100){

thrownewIllegalScoreException("成绩不能超过100分。");

}else{

returnscore;

}

}7.1.5自定义异常

//2.2定义main方法

publicstaticvoidmain(String[]args){

intscore;

System.out.print("请输入Java成绩【0,100】:");

Scannerscanner=newScanner(System.in);

score=scanner.nextInt();

//检查成绩方法调用处,捕获处理自定义异常

try{

System.out.println("你的Java成绩为"+checkScore(score)+"分。");

}catch(IllegalScoreExceptione){

System.out.println(e.getMessage());

}

}

}7.1.5自定义异常(5)在文本编辑器视图中,单击运行“”按钮,运行程序,输入成绩-90,运行结果如图7-7所示。7.1.5自定义异常运行结果:

提示:自定义的非法成绩异常类与成绩测试类在同一个文件ScoreException.java中。如果输入超过100分的成绩,同样可以给出异常提示信息,如图7-8所示。

(3)如果输入正常范围内的成绩,可以输出正常成绩,如图7-9所示。(4)checkScore(intscore)必须由static修饰,否则staitc修饰的main方法无法调用成绩检查方法。7.1.5自定义异常7.2任务实现

7.2.1任务1:多catch块的异常捕获7.2.2任务2:输入数据类型异常处理1.任务描述异常的捕获处理中可以有多个catch块,每次只能执行一个catch块,小任务通过数组的元素的访问来体验多个catch块并存的情况,其中包括数组索引越异常,算术异常等,运行效果如图7-11所示。

7.2.1任务1:多catch块的异常捕获2.任务分析(1)根据任务需求,创建类MoreCatch,实现多catch异常捕获处理功能。(2)在MoreCatch类的main()方法中定义一维数组并初始化,设计出可能会出现算术异常的数据。(3)通过算术运算,对一维数组中元素进行访问,设计可能出现异常的各种情况。7.2.1任务1:多catch块的异常捕获3.任务实施7.2.1任务1:多catch块的异常捕获4.任务小结(1)多个catch块并存时,同时只能执行一个catch,且异常处理原理是先小类型,再大类型,例如,算术异常和其父类异常同时出现时,先处理算术异常。(2)如果数组索引没有越界且除数不为0时,可以输出正常运行结果,例如将try块的第2、3条语句改为:intb=a[5]/a[1];intc=a[3]/a[2];运行结果如图7-12所示。7.2.1任务1:多catch块的异常捕获1.任务描述“输入数据类型异常处理”主要通过输入一个1-7之间的整数,分别代表星期一到星期日,如果输入非整数给出相应的异常处理信息,运行效果如图7-13所示。

7.2.2任务2:输入数据类型异常处理2.任务分析(1)根据任务需求,创建类DataTypeException,实现输入错误数据类型异常捕获处理功能。(2)在DataTypeException类的main()方法中,定义代表星期的整型变量week,通过键盘输入week的值,并使用多分支完成判断,输出对应的星期,通过异常捕获处理实现输入错误数据类型数据时异常的处理。7.2.2任务2:输入数据类型异常处理3.任务实施7.2.2任务2:输入数据类型异常处理4.任务小结(1)如果不进行输入类型异常捕获处理的话,在程序运行后,输入非整型数据,系统直接报输入数据类型异常并终止程序,例如:在当前包下,复制粘贴DataTypeException类,名称为DataTypeException1,删除捕获异常语句,运行结果如图7-14所示。(2)如果输入的整数不在1-7之间,通过switch进行了判断,并给出“输入错误”的提示。7.2.2任务2:输入数据类型异常处理7.3任务拓展:年龄范围限制异常处理

任务描述任务分析任务实施任务小结人无完人,金无足赤,程序同样存在其不

温馨提示

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

评论

0/150

提交评论