资源预览内容
第1页 / 共102页
第2页 / 共102页
第3页 / 共102页
第4页 / 共102页
第5页 / 共102页
第6页 / 共102页
第7页 / 共102页
第8页 / 共102页
第9页 / 共102页
第10页 / 共102页
亲,该文档总共102页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
NCEPU异常机制异常机制24 九月九月 2024异常的概念异常的概念v在在进展程序展程序设计时,错误的的产生是不可防止的生是不可防止的v如何如何处置置错误?v把把错误交交给谁去去处置?置?v程序又程序又该如何从如何从错误中恢复?中恢复?v这是任何程序是任何程序设计言言语都要都要处理的理的问题24 九月九月 2024所所谓错误,是在程序运,是在程序运转过程中程中发生的异常事件,比生的异常事件,比如除如除0溢出、数溢出、数组越界、文件找不到等,越界、文件找不到等,这些事件的些事件的发生将阻止程序的正常运生将阻止程序的正常运转。为了加了加强程序的程序的强健性健性robust,程序,程序设计时,必需思索到能,必需思索到能够发生的生的异常事件并做出相异常事件并做出相应的的处置。置。异常的概念异常的概念24 九月九月 2024 openTheFile; determine its size; allocate that much memory; read-file closeTheFile; 没有没有错误处置的程序置的程序24 九月九月 2024openFiles;if (theFilesOpen) determine the length of the file; if (gotTheFileLength) allocate that much memory; if (gotEnoughMemory) read the file into memory; if (readFailed) errorCode=-1; else errorCode = -2; else errorCode=-3; else errorCode=-4 ;else errorCode=-5; 以常以常规方法方法处置置错误24 九月九月 2024程序可读性差,大量的错误处置代码混杂在程序中察看前面的程序,会发现大部分精神花在出错处置上只把可以想到的错误思索到,此外的情况无法处置出错前往信息量太少,无法更确切的了解错误情况或缘由以常以常规方法方法处置置错误存在的存在的问题24 九月九月 2024 用异常的方式用异常的方式处置置错误try openTheFile; determine its size; allocate that much memory; read-File; closeTheFile; catch (fileopenFailed) dosomething; catch (sizeDetermineFailed) dosomething; catch (memoryAllocateFailed) dosomething; catch (readFailed) dosomething; catch (fileCloseFailed) dosomething; finally dosomething; try里写我里写我们尝试们尝试着要做的事情,着要做的事情,每一个每一个catch针对针对一种能一种能够够的的错误错误每一个每一个错误错误都有相都有相应应的的处处置方法,置方法,并且将并且将实现实现功能功能 事事务逻辑务逻辑 与与错误处错误处置分开来置分开来24 九月九月 2024vJava异常是异常是Java提供的用于提供的用于处处置程序中置程序中错误错误的一种机制。的一种机制。v所所谓错误谓错误是指在程序运是指在程序运转过转过程中程中发发生的一些异常事件生的一些异常事件 如:如:除除0溢出,数溢出,数组组下下标标越界,所要越界,所要读读取的文件不存在取的文件不存在 。v设计设计良好的程序良好的程序应该应该在异常在异常发发生生时时提供提供处处置置这这些些错误错误的方的方法,使得程序不会由于异常的法,使得程序不会由于异常的发发生而阻断或生而阻断或产产生不可生不可预见预见的的结结果。果。Java的异常处置机制24 九月九月 2024vJava程序的程序的执执行行过过程中如出程中如出现现异常事件,可以生成一个异异常事件,可以生成一个异常常类对类对象,象,该该异常异常对对象封装了异常事件的信息并将被提交象封装了异常事件的信息并将被提交给给Java运运转时转时系系统统,这这个个过过程称程称为为抛出抛出 throw 异常。异常。v当当Java运运转时转时系系统统接接纳纳到异常到异常对对象象时时,会,会寻觅处寻觅处置置这这一异一异常的代常的代码码并把当前异常并把当前异常对对象交象交给给其其处处置,置,这这一一过过程称程称为为捕捕获获 catch 异常。异常。Java的异常处置机制24 九月九月 2024Catch an exceptionvvJavaJava的异常机制的益的异常机制的益的异常机制的益的异常机制的益处处处处vv 使我使我使我使我们们们们在一个地方将精神集中在要在一个地方将精神集中在要在一个地方将精神集中在要在一个地方将精神集中在要处处处处理的理的理的理的问题问题问题问题上,而在另一上,而在另一上,而在另一上,而在另一个地方个地方个地方个地方处处处处置来自那部分代置来自那部分代置来自那部分代置来自那部分代码码码码的异常情况。的异常情况。的异常情况。的异常情况。vvtry /Code that may make exception try /Code that may make exception vvcatch(Type1 id1)catch(Type1 id1)vvcatch(Type1 id1)catch(Type1 id1)try openTheFile; determine its size; allocate that much memory; read-File; closeTheFile; catch (fileopenFailed) dosomething; catch (sizeDetermineFailed) dosomething; catch (memoryAllocateFailed) dosomething; catch (readFailed) dosomething; catch (fileCloseFailed) dosomething; finally dosomething; 24 九月九月 2024如何如何处置置 Throw an exception throw new NullPointerException(); 异常异常发生生时,他不能,他不能处理理问题,所以必需抛出一个异常,所以必需抛出一个异常throw一个异常一个异常对象建立起来了象建立起来了当前运当前运转的途径被停的途径被停顿,异常,异常对象被象被弹出出异常异常处置机直接置机直接纳,开,开场寻觅一个适宜的地方来一个适宜的地方来继续执行行24 九月九月 2024把把错误处置代置代码从常从常规代代码中分中分别出来出来按按错误类型分型分组类Exception,派生,派生对无法无法预测的的错误可以捕可以捕获和和处置基置基类,一切的异常,一切的异常类都是都是Exception类的子的子类 抑制了抑制了传统方法方法错误信息有限的信息有限的问题getMessage把把错误传播播给调用堆用堆栈比比较:全局:全局变量,前往量,前往值异常机制的异常机制的优点点method1method2method3method4探探测抛出异常抛出异常传递捕捕获处置异常置异常调 用用24 九月九月 2024e.printStackTace();24 九月九月 2024在异常被抛出的在异常被抛出的过程中程中,任何方法都可以捕任何方法都可以捕获异常并异常并进展相展相应的的处置。置。24 九月九月 2024假假设一切的方法都一切的方法都选择了抛出此异常,了抛出此异常, 最后最后 JVM将将捕捕获它,它,输出相关的出相关的错误信息,并信息,并终止程序的运止程序的运转。24 九月九月 2024JavaJava经过面向面向对象的方法来象的方法来处置程序置程序错误,在,在JavaJava中,中,错误被被称称为异常异常ExceptionException例外例外Java 处置错误的方法在一个方法的运在一个方法的运转过程中,假程中,假设发生了异常,那么生了异常,那么这个方法个方法或者是或者是JavaJava虚虚拟机生成一个代表机生成一个代表该异常的异常的对象包含了象包含了该异异常的常的详细信息,并把它交信息,并把它交给运运转时系系统,运,运转时系系统寻觅相相应的代的代码来来处置置这一异常。一异常。24 九月九月 2024Java 处置错误的方法我我们把生成异常把生成异常对象并把它提交象并把它提交给运运转时系系统的的过程称程称为抛出抛出(throw)(throw)一个异常。一个异常。运运转时系系统在方法的在方法的调用用栈中中查找,从生成异找,从生成异常的方法开常的方法开场进展回朔,直到找到包含相展回朔,直到找到包含相应异常异常处置的置的方法方法为止,止,这一个一个过程称程称为捕捕获(catch)(catch)一个异常。一个异常。24 九月九月 2024当方法由于本身无法控制的当方法由于本身无法控制的缘由而不能完成其由而不能完成其义务文件不存在,网文件不存在,网络衔接无法建立接无法建立处置在方法、置在方法、类库、类中抛出的异常中抛出的异常如如FileInputStream.read产生生IOException在大的工程中采用一致的方式在大的工程中采用一致的方式处置异常置异常时如如编写一个文字写一个文字处置器置器异常异常应该是不是不经常常发生但却能生但却能够发生的缺点生的缺点一定一定发生的事件不生的事件不应该用例外机制来用例外机制来处置置异常异常处置用于使系置用于使系统从缺点中恢复从缺点中恢复提示信息提示信息/不不产生无效的生无效的结果果/释放放资源源什么情况下运用异常机制什么情况下运用异常机制24 九月九月 2024n终止程序会止程序会导致致资源走漏,利用异常源走漏,利用异常处置置释放放资源源n尽能尽能够近地近地处置异常,置异常,这样程序明晰易程序明晰易读n能在部分能在部分处置的置的错误不要运用异常机制不要运用异常机制n异常机制的异常机制的处置比正常置比正常处置效率低置效率低处置异常置异常时的本卷的本卷须知知24 九月九月 2024Contents1.异常处置2.异常分类3.抛出异常4.创建异常类24 九月九月 20241 错误与异常 v在程序运在程序运转时,经常会出常会出现一些非正常的景象,一些非正常的景象,如死循如死循环、非正常退出等,称、非正常退出等,称为运运转错误。v根据根据错误的性的性质将运将运转错误分成两分成两类:错误和异常。和异常。 24 九月九月 20241 错误与异常 一、一、错误错误是致命性的,即程序遇到了非常是致命性的,即程序遇到了非常严重的不正常重的不正常形状,不能形状,不能简单地恢复地恢复执行。行。 例如:程序例如:程序进入了死循入了死循环,或,或递归无法无法终了、或内了、或内存溢出。存溢出。错误只能在只能在编程程阶段段处理,运理,运转程序本身无法程序本身无法处理,理,只能依托其他程序干涉,否那么会不断只能依托其他程序干涉,否那么会不断处于非正于非正常形状。常形状。24 九月九月 20241 错误与异常 二、异常二、异常异常是非致命性的,异常是非致命性的,经过某种修正后,程序某种修正后,程序还能能继续执行。行。例如:运算例如:运算时除数除数为0 0,或操作数超出数据范,或操作数超出数据范围,或翻,或翻开一个文件开一个文件时发现文件并不存在,或欲装入的文件并不存在,或欲装入的类文件文件丧失,或网失,或网络衔接中断等等。接中断等等。 在源程序中参与在源程序中参与处置异常的代置异常的代码,当程序运,当程序运转中出中出现异异常常时,由异常,由异常处置代置代码调整程序运整程序运转方向,使程序依方向,使程序依然可以然可以继续运运转直至正常直至正常终了。了。致命性的、程序本身无法致命性的、程序本身无法处理的理的严重的运重的运转错误,叫作叫作错误;例如死循例如死循环、内存溢出,等、内存溢出,等非致命性的,可以由程序中的异常非致命性的,可以由程序中的异常处置代置代码处理,理,程序程序还能能继续正常运正常运转的运的运转错误,叫作异常。,叫作异常。例如数例如数组下下标越界、除数越界、除数为0 0,等。,等。24 九月九月 20241 错误错误与异常与异常 vJava经过错误类经过错误类(Error)和异常和异常类类(Exception)来来处处置置错误错误和异常,它和异常,它们们都都实现实现了了Throwable接口。接口。 ObjectThrowableError错误类错误类Exception异常类异常类异常异常类Exception:当当发生异常生异常时,产生一个异常事件,生成一个异常生一个异常事件,生成一个异常对象象Exception类或其子或其子类对象,并把它提交象,并把它提交给运运转系系统,再由运再由运转系系统寻觅相相应的代的代码来来处置异常。置异常。这个个过程称程称为抛出一个异常。抛出一个异常。 异常异常类Exception:Exception类有各种不同的子有各种不同的子类,分分别对应不同不同类型的异常型的异常,如除数如除数为0的算的算术异常异常,数数组下下标越界异常越界异常,空指空指针异常等。异常等。 异常异常类Exception:一个异常一个异常对象可以由象可以由Java虚虚拟机生成,也可以由运机生成,也可以由运转的的方法生成。方法生成。异常异常对象中包含了异常事件象中包含了异常事件类型、程序运型、程序运转形状等必要的形状等必要的信息。信息。异常异常类Exception:异常被抛出后异常被抛出后,运运转时系系统把从生成把从生成对象的代象的代码开开场,沿着沿着方法的方法的调用用栈逐逐层回溯回溯查找找,直到找到相直到找到相应的的处置方法置方法,并并把异常把异常对象交象交给该方法方法为止止.这个个过程叫作捕程叫作捕获一个异常。一个异常。简单地地说:发现异常的代异常的代码可以可以“抛出一个异常,抛出一个异常,运运转系系统“捕捕获该异常,交由程序异常,交由程序员编写的相写的相应代代码进展异常展异常处置。置。 错误类Error: 代表代表编译期和系期和系统错误Error类对象由象由Java虚虚拟机生成并抛出机生成并抛出给系系统,普通不由普通不由程序程序处置。死循置。死循环、递归无法无法终了、了、动态链接接错误等。通常等。通常只能依托其他程序干涉,否那么会不断只能依托其他程序干涉,否那么会不断处于非正常形状。于非正常形状。24 九月九月 20241 1 异常异常处处置置 一、异常的一、异常的产生生public class HelloWorld public static void main (String args) int i = 0;String greetings = Hello world!, No, I mean it !,HELLO WORLD! ;while ( i 4 ) System.out.println(greetings i ) ;i +; greetings0=Hello world!“greetings1=No, I mean it !greetings2=HELLO WORLD! i = 0时时,输输出出greetings0:Hello world!i = 1时时,输输出出greetings1: No, I mean it !i = 2时时,输输出出greetings1:HELLO WORLD!i = 3时时,数,数组组下下标标越界,此越界,此时时系系统报统报告异常告异常对对象象类类型:型:Exception in thread main java.lang.ArrayIndexOutOfBoundsException:3at HelloWorld.main(HelloWorld.java:9)异常异常对象象类型:数型:数组越界异常越界异常类 第几个数第几个数组下下标越界越界 发生异常的方法生异常的方法 发生异常的生异常的类 发生异常的行生异常的行24 九月九月 20242 2 异常异常处处置置 一、异常的一、异常的产生生public class Try1 public static void main (String args) int i = 0;int a = 5, 6, 7, 8 ; /简单类型不new也行for ( ; i 5 ; i +) System.out.println( a + i +=+a i ) ; System.out.println( 3/0 = + ( 3/0 ) );i = 0时时,输输出:出: a 0 = 5i = 1时时,输输出:出: a 1 = 6i = 2时时,输输出:出: a 2 = 7i = 3时时,输输出:出: a 3 = 8i = 4时时,数,数组组下下标标越界,此越界,此时时系系统报统报告异常告异常对对象象类类型:型:Exception in thread main java.lang.ArrayIndexOutOfBoundsException:4at Try1.main(Try1.java:6)此此时终止程序运止程序运转,因此不会,因此不会执行行同同样会会产生异常的生异常的输出出语句:句:24 九月九月 20242 2 异常异常处处置置 一、异常的一、异常的产生生public class Try1 public static void main (String args) int i = 0;int a = 5, 6, 7, 8 ;for ( ; i 4 ; i +) System.out.println( a + i +=+a i ) ; System.out.println( 3/0 = + ( 3/0 ) );3/0时时,产产生算生算术术异常,此异常,此时时系系统报统报告异常告异常对对象象类类型:型:Exception in thread main java.lang.ArithmeticExce-ption: / by zeroat Try1.main(Try1.java:9)算算术异常,由分母异常,由分母为0 0产生生24 九月九月 2024异常异常处处置机制置机制 捕捕获异常异常声明抛出异常声明抛出异常throwsTry-catch消极的消极的处置方式置方式积极的极的处置置方式方式24 九月九月 20242 异常处置 普通来说,系统捕获抛出的异常对象并输出相应的信息,同时终止程序运转,导致其后的程序无法运转。人们总是期望可以让程序来接纳并处置产生的异常对象,从而使程序可以正常地往下继续执行。这就是异常捕获和处置的意义所在。二、异常的捕二、异常的捕获和和处置置24 九月九月 2024n捕捕获异常:异常: try,catch和和finally语句。句。n运用运用try语句括住能句括住能够抛出异常的代抛出异常的代码段,用段,用 catch语句句指明要捕指明要捕获的异常及相的异常及相应的的处置代置代码。ntry与与catch语句的句的语法格式如下:法格式如下:ntry / 此此处为抛出抛出详细异常的代异常的代码 2 异常处置 24 九月九月 20242 异常处置 在Java的异常处置机制中,提供了trycatchfinally语句来捕获和处置一个或多个异常。-语法格式为二、异常的捕二、异常的捕获和和处置置能能够产生异常的代生异常的代码维护代代码捕捕获某种异常某种异常对象象进展展处置的代置的代码必然要必然要执行的代行的代码 try catch (ExceptionType e) finally catch语语句至少有一个,可以有多个句至少有一个,可以有多个finally语语句可以省略句可以省略try-catch-finallytry-catch-finally语语语语句的作用:句的作用:句的作用:句的作用:当当当当trytry语语语语句中的代句中的代句中的代句中的代码产码产码产码产生异常生异常生异常生异常时时时时,根据异常的不同,由不,根据异常的不同,由不,根据异常的不同,由不,根据异常的不同,由不同的同的同的同的catchcatch语语语语句中的代句中的代句中的代句中的代码对码对码对码对异常异常异常异常进进进进展捕展捕展捕展捕获获获获并并并并处处处处置置置置 假假假假设设设设没没没没有有有有产产产产生异常,那么生异常,那么生异常,那么生异常,那么catchcatch语语语语句句句句不不不不执执执执行行行行) );而无;而无;而无;而无论论论论能否捕能否捕能否捕能否捕获获获获到到到到异常,都必需异常,都必需异常,都必需异常,都必需执执执执行行行行finallyfinally语语语语句中的代句中的代句中的代句中的代码码码码24 九月九月 20242 异常处置 24 九月九月 2024public class SystemException public static void main(String args) int a = 68; int b = 0; try System.out.println(a / b); catch (ArithmeticException e) System.out.println (“0用作了除数用作了除数); System.out.println(“getMessage=+e.getMessage() System.out.println(“程序程序终终了了); 这句能句能执行么?行么?24 九月九月 2024finally语句v当一个异常被抛出当一个异常被抛出时,程序的,程序的执行就不再是行就不再是线性的,跳性的,跳过某些行,甚至会由于没有与之匹配的某些行,甚至会由于没有与之匹配的catch子句而子句而过早地前早地前往。往。v利用利用finally子句可以保子句可以保证,无,无论try程序程序块中能否抛出异常,中能否抛出异常, finally程序程序块中的中的语句都会被句都会被执行到,行到,这样可以可以对程序的形程序的形状作一致的管理。状作一致的管理。 finally语句句对加加强程序的程序的强健性非常重健性非常重要。要。 通常通常finally进展展资源的去除任源的去除任务:比如:比如删除除暂时文件,封文件,封锁翻开的文件等翻开的文件等24 九月九月 2024在前例中运用在前例中运用finally语句句public class SystemException public static void main(String args) int a = 68; int b = 0; try System.out.println(a / b); catch (ArithmeticException e) System.out.println (“0用作了除数用作了除数); System.out.println(“getMessage=+e.getMessage() finally System.out.println(“程序程序终终了了); 24 九月九月 2024多个多个catch语句句class ExceptionDemo2 public static void main(String args) try int a = args.length; System.out.println(a = + a); int b = 42 / a; int c = 1 ; c4 = 99; catch (ArithmeticException e) / 捕捕获获算算术术运算异常运算异常 System.out.println(Divide by 0: + e); catch (ArrayIndexOutOfBoundsException e) System.out.println(Array index oob: + e); System.out.println(After try/catch blocks.); 24 九月九月 20242 异常异常处处置置 二、异常的捕二、异常的捕获和和处置置改写前面的例如改写前面的例如public class HelloWorldpublic class HelloWorld public static void main (String args) int i = 0;String greetings = Hello world!, No, I mean it !,HELLO WORLD!;while ( i 4 ) System.out.println(greetings i); i +; public class HelloWorld public static void main (String args) int i = 0;String greetings = Hello world!, No, I mean it !,HELLO WORLD!;while ( i 4 ) try System.out.println(greetings i); catch ( ArrayIndexOutOfBoundsException e ) System.out.println(Re-setting Index Value); i = -1; catch( Exception e ) System.out.println( e.toString() ); finally System.out.println(Always printed); i +; greetings0=Hello world!“greetings1=No, I mean it !greetings2=HELLO WORLD! i = 0 时时:输输出出greetings0i = 0 时时:然后:然后执执行行finally语语句句Hello world!i = 0 时时:然后:然后 i+Hello world!Always printed24 九月九月 20242 2 异常异常处处置置 二、异常的捕二、异常的捕获和和处置置public class HelloWorld public static void main (String args) int i = 0;String greetings = Hello world!, No, I mean it !,HELLO WORLD!;while ( i 4 ) try System.out.println(greetings i); catch ( ArrayIndexOutOfBoundsException e ) System.out.println(Re-setting Index Value); i = -1; catch( Exception e ) System.out.println( e.toString() ); finally System.out.println(Always printed); i +; greetings0=Hello world!greetings1=No, I mean it !greetings2=HELLO WORLD! i = 1 时:继续循环时:继续循环i = 1 时时:输输出出greetings1Hello world!Always printedi = 1 时时:然后:然后执执行行finally语语句句Hello world!Always printedNo, I mean it !i = 1 时时:然后:然后 i+Hello world!Always printedNo, I mean it !Always printed24 九月九月 20242 2 异常异常处处置置 二、异常的捕二、异常的捕获和和处置置public class HelloWorld public static void main (String args) int i = 0;String greetings = Hello world!, No, I mean it !,HELLO WORLD!;while ( i 4 ) try System.out.println(greetings i); catch ( ArrayIndexOutOfBoundsException e ) System.out.println(Re-setting Index Value); i = -1; catch( Exception e ) System.out.println( e.toString() ); finally System.out.println(Always printed); i +; greetings0=Hello world!“greetings1=No, I mean it !greetings2=HELLO WORLD! i = 2 时:继续循环时:继续循环i = 2 时时:输输出出greetings2i = 2 时时:然后:然后执执行行finally语语句句i = 2 时时:然后:然后 i+Hello world!Always printedNo, I mean it !Always printedHello world!Always printedNo, I mean it !Always printedHELLO WORLD!Hello world!Always printedNo, I mean it !Always printedHELLO WORLD!Always printed24 九月九月 20242 2 异常异常处处置置 二、异常的捕二、异常的捕获和和处置置public class HelloWorld public static void main (String args) int i = 0;String greetings = Hello world!, No, I mean it !,HELLO WORLD!;while ( i 4 ) try System.out.println(greetings i); catch ( ArrayIndexOutOfBoundsException e ) System.out.println(Re-setting Index Value); i = -1; catch( Exception e ) System.out.println( e.toString() ); finally System.out.println(Always printed); i +; greetings0=Hello world!“greetings1=No, I mean it !greetings2=HELLO WORLD! i = 3 时:继续循环时:继续循环Always printedi = 3 时时:抛出抛出ArrayIndexOutOfBoundsException类类异常异常对对象象i = 3 时时:执执行行catch ( ArrayIndexOutOfBoundsException e ) i = 3 时时: i = -1i = 3 时时:然后:然后执执行行finally语语句句i = 3 时时:然后:然后 i+Always printedRe-setting Index Va-lueAlways printedRe-setting Index Va-lueAlways printed24 九月九月 20242 2 异常异常处处置置 二、异常的捕二、异常的捕获和和处置置public class HelloWorld public static void main (String args) int i = 0;String greetings = Hello world!, No, I mean it !,HELLO WORLD!;while ( i 4 ) try System.out.println(greetings i); catch ( ArrayIndexOutOfBoundsException e ) System.out.println(Re-setting Index Value); i = -1; catch( Exception e ) System.out.println( e.toString() ); finally System.out.println(Always printed); i +; greetings0=Hello world!“greetings1=No, I mean it !greetings2=HELLO WORLD! i = 0 时:继续循环时:继续循环(堕入死循环堕入死循环)i = 3 时时:终终了本次循了本次循环时环时i = 4Always printedRe-setting Index Va-lueAlways printedAlways printedRe-setting Index Va-lueAlways printed24 九月九月 20242 2 异常异常处处置置 二、异常的捕二、异常的捕获和和处置置public class HelloWorld public static void main (String args) int i = 0;String greetings = Hello world!, No, I mean it !,HELLO WORLD!;while ( i 4 ) try i = 5 / 0; catch ( ArrayIndexOutOfBoundsException e ) System.out.println(Re-setting Index Value); i = -1; catch( Exception e ) System.out.println( e.toString() ); finally System.out.println(Always printed); i +; 此此时捕捕获的是一个算的是一个算术异常异常ArithmeticException对象象catch( Exception e )将捕将捕获获一切异常的超一切异常的超类对类对象象e.toString()将前往将前往对对象象e的内容字符串的内容字符串(Object类类中方法中方法)输出出为:java.lang.ArithmeticException:/by zero24 九月九月 20242 2 异常异常处处置置 二、异常的捕二、异常的捕获和和处置置public class HelloWorld public static void main (String args) int i = 0;String greetings = Hello world!, No, I mean it !,HELLO WORLD!;while ( i 4 ) try System.out.println(greetings i); catch ( ArrayIndexOutOfBoundsException e ) System.out.println(Re-setting Index Value); i = -1; catch( Exception e ) System.out.println( e.toString() ); finally System.out.println(Always printed); i +; 此此时捕捕获的是的是ArrayIndexOutOfBoundsException对象象将被将被 catch(ArrayIndexOutOfBoundsException e ) 捕捕获因此不会再被因此不会再被 catch( Exception e ) 捕捕获24 九月九月 20242 2 异常异常处处置置 二、异常的捕二、异常的捕获和和处置置public class HelloWorld public static void main (String args) int i = 0;String greetings = Hello world!, No, I mean it !,HELLO WORLD!;while ( i 4 ) try System.out.println(greetings i+5/0); catch ( ArrayIndexOutOfBoundsException e ) System.out.println(Re-setting Index Value); i = -1; catch( Exception e ) System.out.println( e.toString() ); finally System.out.println(Always printed); i +; i=0时时,捕,捕获获的是的是ArithmeticException类类异常异常对对象象java.lang.ArithmeticException:/by zerojava.lang.ArithmeticException:/by zeroAlways printedi=1和和2 :捕捕获获的都是的都是ArithmeticException类类异常异常对对象象i=3:捕捕获获ArrayIndexOutOfBoundsException类类异常异常对对象象24 九月九月 20242 2 异常异常处处置置 二、异常的捕二、异常的捕获和和处置置public class HelloWorld public static void main (String args) int i = 0;String greetings = Hello world!, No, I mean it !,HELLO WORLD!;while ( i 4 ) try System.out.println(greetings i+5/0); catch ( ArrayIndexOutOfBoundsException e ) System.out.println(Re-setting Index Value); i = -1; catch( Exception e ) System.out.println( e.toString() ); finally System.out.println(Always printed); i +; java.lang.ArithmeticException:/by zeroAlways printedi=3:捕获捕获ArrayIndexOutOfBoundsException类异常对象类异常对象 Always printedRe-setting Index ValueRe-setting Index ValueAlways printed24 九月九月 20242 2 异常异常处处置置 二、异常的捕二、异常的捕获和和处置置public class HelloWorld public static void main (String args) int i = 0;String greetings = Hello world!, No, I mean it !,HELLO WORLD!;while ( i 4 ) try System.out.println(5/0+greetings i); catch ( ArrayIndexOutOfBoundsException e ) System.out.println(Re-setting Index Value); i = -1; catch( Exception e ) System.out.println( e.toString() ); finally System.out.println(Always printed); i +; 24 九月九月 20242 2 异常异常处处置置 二、异常的捕二、异常的捕获和和处置置public class HelloWorld public static void main (String args) int i = 0;String greetings = Hello world!, No, I mean it !,HELLO WORLD!;while ( i 4 ) try System.out.println(5/0+greetings i); catch (Exception e ) System.out.println(e.toString() ); i = -1; catch(ArrayIndexOutOfBoundsException e ) System.out.println(Re-setting Index Value); finally System.out.println(Always printed); i +; catch 语语句的句的陈陈列列顺顺序是从特殊到普通序是从特殊到普通exception java.lang.ArrayIndexOutOfBounds-Exception has already been caughtcatch (Exception e ) 放在捕捉其他放在捕捉其他详细详细异常异常类类的的语语句后句后24 九月九月 2024练习v设以下以下try-catch语句句块中的第二个中的第二个语句句s2将引起一个异常,将引起一个异常,试回答以下回答以下问题:try s1; s2; s3; catch (ExceptionType e1) dosomething; catch (ExceptionType e2) dosomething; s4; 1S3会会执行么?行么?2假假设异常未被捕异常未被捕获,s4会被会被执行么?行么?3假假设catch子句捕子句捕获了异常,了异常,s4会会执行么?行么?24 九月九月 2024捕捕获和和处置异常置异常vExceptionType1,ExceptionType2,.,ExceptionTypek是是产产生的异常生的异常类类型。型。v根据根据发发生异常所属的生异常所属的类类,找到,找到对应对应的的catch语语句,然后句,然后执执行其后行其后的的语语句序列。句序列。v不不论论能否捕能否捕获获到,到,总总要要执执行行finally后面的后面的语语句。句。 v在有多个异常需求捕在有多个异常需求捕获时获时,异常,异常类类型的型的顺顺序很重要,在序很重要,在类层类层次次树树中,普通的异常中,普通的异常类类型要放在后面,特殊的放在前面。型要放在后面,特殊的放在前面。v在在catch块块的后面可以放的后面可以放 finally 块块,其作用通常用于,其作用通常用于释释放放资资源源24 九月九月 2024异常异常类(Exception)的常用方法的常用方法类的全名的全名 + :+ Messagethrow new Exception(“下下标标越界越界)24 九月九月 2024例:例:public class CS public static void main(String args) try System.out.println(第一句); System.out.println (“第二句 5/0=+(5/0); System.out.println(第三句); catch(ArithmeticException e ) /ArrayIndexOutOfBoundsException e.printStackTrace(); System.out.println( 捕获 +e.toString()+ 异常+ +e.getMessage(); System.out.println(第四句);24 九月九月 2024 3 异常分类vJ2SDK定定义义了很多异常了很多异常类类,这这些些类对应类对应了各种各了各种各样样能能够够出出现现的异常事件。的异常事件。ThrowableEorrorExceptionRuntimeException24 九月九月 2024vError:称称为错误为错误,由,由Java虚虚拟拟机生成并抛出,包括机生成并抛出,包括动态链动态链接失接失败败、虚、虚拟拟机机错误错误等,程序等,程序对对其不做其不做处处置。置。 也也处处置不了置不了 vException:一切异常:一切异常类类的父的父类类,其子,其子类对应类对应了各种各了各种各样样能能够够出出现现的异常事件,普通需求用的异常事件,普通需求用户显户显式的声明或捕式的声明或捕获获。vRuntime Exception:一:一类类特殊的异常,如被特殊的异常,如被0除、数据下除、数据下标标越界等,其越界等,其产产生比生比较频较频繁,繁,处处置置费费事,假事,假设显设显式的声明或捕式的声明或捕获获将会将会对对程序可程序可读读性和运性和运转转效率影响很大。因此由系效率影响很大。因此由系统统自自动检测动检测并将它并将它们们交交给给缺省的异常缺省的异常处处置程序置程序 用用户户可不用可不用对对其其处处置置 。 3 异常分异常分类24 九月九月 2024 3 3 异常分异常分类v一切的包中都定一切的包中都定义了异常了异常类和和错误类。vException类是一切异常的父是一切异常的父类vError类是一切是一切错误的父的父类,这两个两个类都都实现了了Throwable接口。接口。24 九月九月 20243 3 异常分异常分类类 ThrowableErrorException虚拟机错误虚拟机错误内存溢出错误内存溢出错误图形界面错误图形界面错误内存溢内存溢出错误出错误栈溢出栈溢出错误错误类定义未类定义未找到错误找到错误24 九月九月 20243 3 异常分异常分类类 ThrowableErrorExceptionRuntimeException运转时异常运转时异常文件已文件已终了异常终了异常文件未文件未找到异常找到异常方法未方法未找到异常找到异常输入输出输入输出异常异常图形界面图形界面异常异常24 九月九月 20243 3 异常分异常分类类 ThrowableErrorExceptionRuntimeException运转时异常运转时异常算术算术异常异常类型强迫类型强迫转换异常转换异常方法未方法未找到异常找到异常输入输出输入输出异常异常图形界面图形界面异常异常空指针空指针异常异常数组负数组负下标异常下标异常违背平安违背平安原那么异常原那么异常数组下标越界异常数组下标越界异常下标越界异常下标越界异常IndexOutOfBoundsExceptioncatch (ArrayIndexOutOfBoundsException e )catch (IndexOutOfBoundsException e )catch (RuntimeException e )catch (Exception e )catch (Throwable e )24 九月九月 20243 异常分类算算术异常异常ArithmeticExceptionArithmeticException整数除法中,假整数除法中,假设除数除数为0 0,或用,或用0 0取模,会取模,会发生生该异常。异常。例如:例如:inti=12/0;inti=12/0;intm=5%0;intm=5%0;其他算其他算术操作不会操作不会产生异常生异常几个常几个常见的公用异常的公用异常类24 九月九月 20243 异常分类空指针异常NullPointerException当程序试图访问一个空对象即没有实例化的对象中的变量或方法,或一个空数组中的元素时,会发生该异常。例如:inta=null;a0=0;Strings=null;System.out.println(s.length();几个常几个常见的公用异常的公用异常类24 九月九月 20243 异常分类类型型强迫迫转换异常异常ClassCastExceptionClassCastException当当进展展类型型强迫迫转换时,对于不能于不能进展的展的转换操作,会操作,会发生生该异常。异常。例如:例如:Objectobj=newObject();Objectobj=newObject();Strings=(String)obj;Strings=(String)obj;几个常几个常见的公用异常的公用异常类24 九月九月 20243 异常分类数组负下标异常NagativeArraySizeException创建数组时,假设数组元素个数为负,会发生该异常。例如:inta=newint-3;几个常几个常见的公用异常的公用异常类24 九月九月 20243 异常分类数组下标越界异常ArrayIndexOutOfBoundsException试图访问一个越界的数组元素时即下标大于等于数组的成员变量length,会发生该异常。例如:inta=newint1;a1=3;几个常几个常见的公用异常的公用异常类24 九月九月 20243 异常分类ArithmeticExceptionArithmeticExceptionNullPointerExceptionNullPointerExceptionClassCastExceptionClassCastExceptionNagativeArraySizeExceptionNagativeArraySizeExceptionArrayIndexOutOfBoundsExceptionArrayIndexOutOfBoundsException都是运都是运转时异常异常类(RuntimeException)(RuntimeException)的子的子类几个常几个常见的公用异常的公用异常类24 九月九月 2024异常的分异常的分类v程序程序对错误与异常的三种与异常的三种处置方式:置方式:v1程序不能程序不能处置的置的错误v Error类错误普通由系普通由系统进展展处置,程序本身无法捕置,程序本身无法捕获和和处置。置。v2程序程序应去防止而不是去捕去防止而不是去捕获的异常的异常v 对于运于运转时异常异常类如数租越界等,在程序如数租越界等,在程序设计正常正常时不会不会发生。生。这类异常异常应经过程序程序调试尽量防止而不是去捕尽量防止而不是去捕获它。它。v3必需捕必需捕获的异常的异常v 有些异常在有些异常在编写程序写程序时是无法是无法预料的,料的,为了保了保证程序的程序的强壮性,壮性,Java要求必需要求必需对能能够出出现这些异常的代些异常的代码用用try-catch-finally语句,否那么句,否那么编译无法无法经过。文件没找到、网文件没找到、网络通通讯失失败异常等异常等24 九月九月 2024前面所提到的异常或者是由前面所提到的异常或者是由JavaJava虚虚拟机生成,或者是由机生成,或者是由JavaJava类库中的某些中的某些类生成。生成。现实上,我上,我们在程序中也可以生在程序中也可以生本本钱人的异常人的异常对象,也即是异常可以不是出象,也即是异常可以不是出错产生,而是人生,而是人为地抛出。地抛出。不不论哪种方式,生成异常哪种方式,生成异常对象都是象都是经过throwthrow语句句实现:thrownewThrowableObject();thrownewThrowableObject();ArithmeticExceptione=newArithmeticException();ArithmeticExceptione=newArithmeticException();throwe;throwe;留意:生成的异常留意:生成的异常对象象须是是ThrowableThrowable或其子或其子类的的实例。例。4 抛出异常24 九月九月 20244 抛出异常v如前所如前所见,在捕,在捕获一个异常前,必需有一段代一个异常前,必需有一段代码产生生一个异常一个异常对象,并把它抛出象,并把它抛出v抛出的异常既可以是抛出的异常既可以是JavaJava运运转时系系统如前面的例子如前面的例子也可以是由程序也可以是由程序员本人本人编写的代写的代码即在即在trytry语句中句中的代的代码本身不会由系本身不会由系统产生异常,而是由程序生异常,而是由程序员故意故意抛出异常抛出异常24 九月九月 20244 抛出异常v留意:假设某个代码运用throw语句抛出了异常,那么必需运用try-catch语句进展捕捉处置,否那么会出现编译错误,系统显示要求进展异常捕获的信息。1.运用运用throw语语句抛出异常句抛出异常24 九月九月 20244 4 抛出异常抛出异常v运用throw语句抛出异常的格式为throw其中:throw是关键字是创建的异常类对象1.运用throw语句抛出异常class ExceptionTry public void run ( byte k ) byte y = 1, i ;for ( i = 1; i = k; i + )y = (byte) ( y * i );System.out.println( k + ! = + y );public static void main (String args) ExceptionTry et = new ExceptionTry ();for ( byte i = 1; i 8; i + )et.run ( i );究竟哪些究竟哪些结果是果是错误的,从什么的,从什么时候开候开场溢出的,溢出的,在在编程程时不能确定,必需在程序中添加不能确定,必需在程序中添加检测手段手段数据溢出数据溢出(byte型只需型只需8位:位:-127128)1! = 12! = 23! = 64! = 245! = 1206! = -487! = -8024 九月九月 20244 4 抛出异常抛出异常class ExceptionTry public void run ( byte k ) byte y = 1, i ;for (i = 1; i Byte.MAX_VALUE / i )throw new Exception(overflow); else y = (byte) ( y * i ); catch (Exception e ) System.out.println(e.getMessage();e.printStackTrace(); /显示异常信息System.exit (0); System.out.println( k + ! = + y );public static void main (String args) for (byte i=1;i8;i+) et.run(i); i=5时时,y=120; i=6时时,Byte.MAX_VALUE/i = 127/6 = 21,抛出异常,抛出异常overflow24 九月九月 20244 4 抛出异常抛出异常class ExceptionTry public void run ( byte k ) byte y = 1, i ;for (i = 1; i Byte.MAX_VALUE / i )throw new Exception(overflow); else y = (byte) ( y * i ); catch (Exception e ) System.out.println(e.getMessage();e.printStackTrace(); /显示异常信息System.exit (0); System.out.println( k + ! = + y );public static void main (String args) for (byte i=1;i8;i+) et.run(i); i=5时,时,y=120; i=6时,时,Byte.MAX_VALUE/i = 127/6 = 21,抛出异常,抛出异常overflowoverflowjava.lang.Exception: overflowat ExceptionTry.run (ExceptionTry.java:6) at ExceptionTry.main(ExceptionTry.java.13)24 九月九月 2024v在前面的例子中,异常的产生和处置都是在同一个方法中进展的,也就是说,异常的处置是在产生异常的方法方法中进展的。v在实践编程中,有时并不需求由产生异常的方法本人处置,而需求在该方法之外进展处置。v这时与异常有关的方法就有两个:抛出和处置异常的方法2.抛出的异常让调用方法处置 我我们不能不能预知运用知运用该类该方方法的每个用法的每个用户将将计划如何划如何处理特定的理特定的错误,所以在,所以在发生生一种一种错误时最好的最好的处置方法置方法是抛出一个异常。是抛出一个异常。4 抛出异常24 九月九月 2024Announce for exceptionv通知客通知客户程序程序员本人的方法中能本人的方法中能够抛出什么抛出什么样的异常是一的异常是一种文明的做法。种文明的做法。vvoid f() throws tooBig ,tooSmall,oldStylev /Body of f()v假假设他要从他的方法中抛出某种异常他必需声明他要从他的方法中抛出某种异常他必需声明24 九月九月 20244 抛出异常1抛出异常的方法:抛出异常的方法:需求在声明中添加需求在声明中添加throws子句,格式子句,格式为: ()throws 可以声明多个异常可以声明多个异常类,用逗号隔开,用逗号隔开2.抛出的异常让调用方法处置24 九月九月 20244 4 抛出异常抛出异常2处置异常的方法:置异常的方法:由一个方法抛出异常后,系由一个方法抛出异常后,系统将异常向上将异常向上传送,由送,由调用它的方法用它的方法来来处置置这些异常。些异常。留意:假留意:假设某个方法声明抛出异常,那么某个方法声明抛出异常,那么调用它的方法必需捕用它的方法必需捕获并并处置异常,否那么会出置异常,否那么会出现异常异常错误2.抛出的异常让调用方法处置24 九月九月 20244 4 抛出异常抛出异常class ExceptionTry public void run ( byte k ) throws Exception byte y = 1, i ;for (i = 1; i Byte.MAX_VALUE / i )throw new Exception(overflow); else y = (byte) ( y * i ); System.out.println( k + ! = + y ); public static void main (String args) for (byte i=1;i8;i+) try et.run(i); catch (Exception e ) System.out.println(e.getMessage();System.exit (0); i=5时时5! = 12024 九月九月 20244 4 抛出异常抛出异常class ExceptionTry public void run ( byte k ) throws Exception byte y = 1, i ;for (i = 1; i Byte.MAX_VALUE / i )throw new Exception(overflow); else y = (byte) ( y * i ); System.out.println( k + ! = + y ); public static void main (String args) for (byte i=1;i10) throw new MyException(a);System.out.println(Normal exit); public static void main (String args)try computer (1); computer (20) ; catch (MyException e ) System.out.println(e); 24 九月九月 20245 5 创创建异常建异常类类class MyException extends Exception private int detail;MyException ( int a ) detail = a; public String toString() return MyException+detail+); class ExceptionDemo static void computer (int a) throws MyExceptionSystem.out.println(Called computer:+a);if (a10) throw new MyException(a);System.out.println(Normal exit); public static void main (String args)try computer (1); computer (20) ; catch (MyException e ) System.out.println(e); Called computer: 1Called computer: 1Normal exit24 九月九月 20245 5 创创建异常建异常类类class MyException extends Exception private int detail;MyException ( int a ) detail = a; public String toString() return (MyException+detail+); class ExceptionDemo static void computer (int a) throws MyExceptionSystem.out.println(Called computer:+a);if (a10) throw new MyException(a);System.out.println(Normal exit); public static void main (String args)try computer (1); computer (20) ; catch (MyException e ) System.out.println(e); /调用toString方法Called computer: 20抛出抛出MyException异常异常类对象,其成象,其成员变量量detail=20Called computer: 20MyException2024 九月九月 2024例:在定例:在定义银行行类时,假,假设取取钱数大于余数大于余额那么作那么作为异异 常常处置置(InsufficientFundsException)。思思绪: 产生异常的条件是余生异常的条件是余额少于取少于取额,因此能否抛出异常,因此能否抛出异常 要先判要先判别该条件。条件。 确定确定产生异常的方法,生异常的方法,应该在取在取钱方法方法withdrawal 中中产生异常生异常InsufficientFundsException 。 处置异常安排在置异常安排在调用用withdrawal的的时候,因此候,因此 withdrawal方法要声明异常,由上方法要声明异常,由上级方法捕方法捕获并并处置。置。 要定要定义好本人的异常。好本人的异常。自定自定义异常异常类实例例24 九月九月 2024public class InsufficientFundsException extends Exception private Bank excepbank; private double excepAmount; InsufficientFundsException(Bank ba, double dAmount) excepbank = ba; excepAmount = dAmount; public String excepMesagge() String str = “The balance + excepbank.getbalance() + “The withdrawal was+excepAmount; return str; 24 九月九月 2024class Bank double balance; /余额 public void deposite(double dAmount) /存钱 if(dAmount0.0) balance += dAmount; public void withdrawal(double dAmount) throws InsufficientFundsException /取钱 if( balancedAmout ) throw new InsufficientFundsException(this, dAmount); balance = balance-dAmount; public double getbalance() /获取余额 return balance; 24 九月九月 2024public class ExceptionDemo public static void main(String args) try Bank ba = new Bank(); ba.deposite(50); ba.withdrawal(100); System.out.println(“Withdrawal successful!); catch(Exception e) System.out.println(e. excepMesagge(); 24 九月九月 2024何何时需求自定需求自定义异常异常类vJava异常异常类类体系中不包含所需求的异常体系中不包含所需求的异常类类型型v用用户户需求将本人所提供需求将本人所提供类类的异常与其他人提供的异常与其他人提供类类的异的异常常进进展区分展区分v类类中多次抛出中多次抛出这这种种类类型的异常型的异常v假假设设运用其他程序包中定运用其他程序包中定义义的异常的异常类类,将影响程序包,将影响程序包的独立性与包含性的独立性与包含性24 九月九月 2024作作业1. 有一个表示日期的有一个表示日期的笼统类笼统类abstract class Date abstract boolean isValid( ); /判判别别日期能否合法日期能否合法abstract void daysAfter(int days);/将将调调用用对对象改象改为为days天后的日期天后的日期abstract int between(Date d); /计计算日期算日期对对象与象与d之之间间相隔的天数相隔的天数 24 九月九月 2024作作业 1) 声明一个声明一个类DateD,承,承继Date类,(i) 定定义成成员变量:量:private int year, month, day;(ii) 定定义构造方法:构造方法:DateD(int y, int m, int d), DateD (DateD d) 和和 DateD()(iii) 定定义成成员方法:方法:void printDate() (iv) 实现一切的一切的笼统方法方法24 九月九月 2024作作业vfairyzcysina构造一个构造一个类Date来描画日期,并构造一个异常来描画日期,并构造一个异常类WrongDate要求:要求:在在Date类中包括表示年、月、日的三个整型的成中包括表示年、月、日的三个整型的成员变量,要求遵照量,要求遵照封装原那么封装原那么在在Date类中中仅定定义一个构造方法,包含三个用来表示年、月、日的一个构造方法,包含三个用来表示年、月、日的整型参数整型参数24 九月九月 2024作作业vfairyzcysinan在构造方法中,当构造的日期无效在构造方法中,当构造的日期无效时可抛出一个可抛出一个WrongDate对象象提示:当表示月的提示:当表示月的变量不在量不在112之之间,或者表示日的,或者表示日的变量超越量超越了本月的最大天数了本月的最大天数时,视该日期无效日期无效nWrongDate异常异常类的的对象可以表示象可以表示错误的日期,格式的日期,格式为:2004/2/31提示:提示:经过toString()方法方法设置异常置异常类对象的成象的成员变量量n在另一个在另一个类MyDate的的main方法中,方法中,创建一个建一个Date类的的对象象d,同同时捕捕获异常异常NCEPUthemegallery
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号