java_异常处理.

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

2第9章异常处理异常处理——捕获和处理运行时错误的一种机制。异常处理机制使程序具有处理错误的能力,即使发生了运行时错误,应用程序能够捕获异常并及时处理异常,使程序从运行时错误中很好地恢复并继续运行,而不会导致程序运行非正常终止。3第9章异常处理9.1程序错误与处理9.2Java的异常处理49.1程序错误与处理9.1.1程序错误、发现时刻及错误处理原则9.1.2面向过程语言与面向对象语言的错误处理方式比较9.1.3Java的错误和异常51.语法错(编译错)9.1.1程序错误、发现时刻及错误处理原则语法错—违反语法规范的错误,通常在编译时发现。例如:标识符未声明、表达式中运算符与操作数类型不兼容、变量赋值时的类型与声明时的类型不匹配、括号不匹配、语句末尾缺少分号等。发现和排除:Java编译器能够发现所有语法错,给出错误的位置和性质。——syntaxerror62.语义错(运行错)9.1.1程序错误、发现时刻及错误处理原则语义错—如果程序在语法上正确,但在语义上存在错误。不能被编译系统发现,只有到程序运行时才能被系统发现,所以含有语义错的程序能够通过编译。—semanticerror(run-timeerror)例如:输入数据格式错、除数为0错、数组下标越界、打开的文件不存在、给变量赋予超出其范围的值等。发现和排除:Java解释器在运行时能够发现语义错,一旦发现了语义错,Java将停止程序运行,并给出错误的位置和性质。73.逻辑错9.1.1程序错误、发现时刻及错误处理原则—logicerror语义错—如果程序通过编译,可运行,但运行结果与期望值不符,这类错误称为逻辑错。例如:由于循环条件不正确而没有结果,循环次数不对等因素导致计算结果不正确等。发现和排除:由于系统无法找到逻辑错,所以逻辑错最难确定和排除。程序员必须凭借自身的程序设计经验,找到错误原因及出错位置,从而改正错误。139.1.3Java的错误和异常2.错误与异常(1)错误(error)错误—指程序运行时遇到的硬件或操作系统的错误。错误对于程序而言是致命的,将导致程序无法运行,而且程序本身不能处理错误,只能依靠外界干预,否则会一直处于非正常状态。例如:没有找到.class文件;.class文件中没有main()方法等。149.1.3Java的错误和异常2.错误与异常(2)异常(exception)异常—指在硬件和操作系统正常时,程序遇到的运行错。异常对于程序而言是非致命的,虽然异常会导致程序非正常终止,但Java的异常处理机制使程序自身能够捕获和处理异常,由异常处理代码调整程序运行方向,使程序仍可继续运行。例如:整数进行除法运算时除数为0;操作数超出数据范围;打开一个文件时发现文件不存在;网络连接中断等。15编译程序非正常终止运行有语法错?有Java程序修改运行出现运行时错误?错误程序运行正常结束有没有没有异常程序非正常终止运行事先处理避免异常事后处理异常处理修改图9.1Java程序发现错误和异常169.1.3Java的错误和异常3.错误类和异常类(1)Error类(错误类)Error类对象由Java虚拟机生成并抛出给系统,有内存溢出错误、栈溢出错误、动态链接错误等。例如:当运行没有main()方法的类时,则产生类定义未找到错误(noClassDefFoundError);当使用new分配内存时,如果没有可用内存,则产生内存溢出错误(OutOfMemoryError);179.1.3Java的错误和异常(2)Exception类(异常类)3.错误类和异常类Exception类对象是Java程序捕获和处理的对象。每一种异常对应于Exception类的一个子类,异常对象中包含错误的位置和特征信息。Java预定义了多种通用的异常类:例如除数为0的算术异常、数组下标越界异常、空指针异常等。Java中也可以自定义异常类。注:Exception类和Error类都是Throwable类的子类。189.1.3Java的错误和异常【例9.1】发现除数为0错。①运行时能够发现整数除法中除数为0的语义错。②运行时不能发现浮点数除法中除数为0的语义错。对于整数除法中除数为0的语义错,Java在运行时能够发现并抛出异常,程序停止运行;对于浮点除法中除数为0的语义错,Java在运行时不能发现,运算结果为Infinity(无穷大)。System.out.println(+(3/0));//整数除法,除数为0,抛出算术异常System.out.println(+(3/0.0));//浮点数除法,除数为0,没有抛出异常,运行结果为Infinity(无穷大)199.1.3Java的错误和异常【例9.2】发现数组下标越界的语义错。publicclassOutofbounds{publicstaticvoidmain(Stringargs[]){inta[]={1,2,3,4};for(inti=0;i9;i++)System.out.println(“a[+i+]=+a[i]);}}209.1.3Java的错误和异常4.程序对错误与异常的三种处理方式(1)程序不能处理错误(2)程序应避免而不捕获的异常内存溢出、栈溢出等错误,由系统进行处理,Java程序本身不能对错误进行处理。对于程序能够遇见的异常,程序应该考虑周到进行实现处理,尽量避免发生异常。219.1.3Java的错误和异常4.程序对错误与异常的三种处理方式(3)必须捕获的异常对于程序无法预见的、由特殊环境错误造成的异常,必须进行捕获和处理,从而保证程序正常运行,保证程序的可靠性和安全性。229.2Java的异常处理9.2.1异常类说明9.2.2异常处理语句9.2.3抛出异常9.2.4自定义异常类异常类层次结构239.2.1异常类说明异常类层次结构249.2.1异常类说明Error子类由系统保留,该类定义了应用程序通常无法捕捉到的错误内存溢出错、栈溢出错等,java程序不处理,交由操作系统处理259.2.1异常类说明1.Exception异常类publicclassThrowableimplementsSerializable{publicThrowable()publicThrowable(Stringmessage)publicStringgetMessage()//获得异常信息publicStringtoString()//获得异常对象的描述信息publicvoidprintStackTrace()//显示异常栈跟踪信息}publicclassExceptionextendsThrowable{publicException()publicException(Strings)}269.2.1异常类说明2.RuntimeException运行异常类运行异常—指由程序本身错误引发的异常,这类异常程序设计时大多可以避免;非运行异常—指由程序运行环境错误引发的异常,这类异常必须捕获并处理。注:运行异常都是RuntimeException的子类。279.2.1异常类说明2.RuntimeException运行异常类(1)算术异常ArithmeticException(2)空对象异常NullPointerException当进行整数除法或取余运算时,如果除数为0,则会产生。当一个数组变量赋值为空引用(null)时,如果对该数组中的运算进行操作;例如:inta[]=null;a[0]=1;//对空数组中的元素进行操作,产生空对象异常当一个对象赋值为null时,如果通过该空对象调用方法。例如:Stringstr=nullSystem.out.println(str.length());//调用空对象的方法,产生空对象异常289.2.1异常类说明2.RuntimeException运行异常类(3)类型强制转换异常ClassCastException当进行类型强制转换时,如果遇到不能进行的转换操作;例如:Objectobj=newObject();Stringstr=(String)obj;//obj既不是String的实例,也不是其子类的实例,故不能转换,产生异常(4)负数组长度异常NegativeArraySizeException当为一个数组申请存储空间时,如果指定的数组长度是负数。例如:inta[]=newint[-1];//产生负数组长度异常299.2.1异常类说明2.RuntimeException运行异常类(5)数组下标越界异常ArrayIndexOutOfBoundsException(6)数值格式异常NumberFormatException当访问数组元素时,如果下标越界,则产生。例如:inta[]=newint[1];a[1]=1;//产生数组下标越界异常当将字符串转换成整数时,如果给定字符串不符合整数格式。例如:inti=Integer.parseInt(“123”);//正确,不产生异常intj=Integer.parseInt(“abc”);//产生数值格式异常309.2.2异常处理语句一个异常对象经历抛出、捕获及处理过程:抛出(throw)异常—创建一个异常类对象的过程;捕获(catch)异常—获得异常对象的过程;处理异常—对异常对象执行相应操作的过程;注:异常对象由捕获它的语句进行处理。31如何进行异常处理try{语句1}catch(异常类异常对象){语句2}finally{语句333try/catch块2.异常处理语句执行过程(1)正常情况下(即没有产生异常时)首先执行try子句中的语句序列;若没有产生异常则跳过catch子句,再执行finally子句中的语句序列;然后继续执行后面的语句。34try/catch块359.2.2异常处理语句(2)捕获异常并处理catch子句说明:其参数是一个异常对象e,其类型必须是Throwable类的子类,指定当前catch子句所能处理的异常类型。catch语句可以有多个,分别处理不同类的异常。36try/catch块37try/catch块389.2.2异常处理语句【例9.1】异常的捕获和处理。inti;int[]a={1,2,3,4};for(i=0;i5;i++)System.out.println(“a[”+i+”]=”+a[i]);System.out.println(“5/0”+(5/0);9.2.2异常处理语句39=多个catch子句需要按异常类从子类到父类的次序依次排列。通常最后一个catch子句的异常类参数声明为Exception,这样能够保证捕获和处理所有异常对象。异常处理举例4041不执行执行end…42空指针异常抓错了没抓着43空指针异常运行时异常44RuntimeException运行时异常父类书157页抓的时候注意顺序,范围大的异常(父类)要放在异常类子类的后面459.2.2异常处理语句(2)捕获异常并处理执行try子句出现运行错时,Java抛出一个异常对象,由catch子句捕获并处理该异常对象。若catch子句中声明的异常类是该异常对象所属的类或其祖先类,则该catch子句捕获到了该异常对象,再执行该catch子句。catch子句捕获异常的匹配规则如下:抛出异常对象与catch子句参数类型相同;抛出异常对象为catch子句参数类的子类;按照先后次序捕获抛出异常对象,只捕获一次。抛出的异常对象和catch子句中异常类的关系:int[]a={1,2,3,4};for(i=0;i5;++)try{System.out.println(“a[”+i+”]=”+a[i]);}catch(ArrayIndexOutOfBountdsExceptione){System.out.println(“捕获到了数组下标越界异常”)}catch(ArithmeticExceptione){System.out.println(“异常类名称是:”+e)}catch(Exceptione){System.out.println(“捕获”+e.

1 / 56
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功