您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > Ja15-08第9章异常处理.
L/O/G/O第9章异常处理1本章主要内容自定义异常类的设计4异常的定义与分类1try-catch-finally语句2抛出异常的方式329.1异常处理的基本概念异常(exception):在程序运行中由代码产生的一种错误。在不支持异常处理的程序设计语言中,每一个运行错误必须由程序员手动控制(例如C语言)。Java语言:异常处理机制,将程序运行时的管理带到面向对象的世界。39.1.1错误与异常按照错误的性质分类:语法错:是由于违反Java的语法规则而产生的错误,只要没有编译错误,才可生成字节码。语义错(运行错):程序在语法上正确,但在语义上存在错误,如输入数据格式错、除数为0错、给变量赋值超出其允许范围等,这类错误只能在运行时发现,有的还需进行异常处理。逻辑错:程序编译通过,也可运行,但运行结果与预期不符。如由于循环条件不正确而没有结果,循环次数不对等因素导致的计算结果不正确等。只有凭借经验排查。4根据错误严重程度的不同将运行错分类:错误:是指程序在执行过程中所遇到的硬件或操作系统的错误,是致命的,需外界干预。如:内存溢出、虚拟机错等。异常:是指在硬件和操作系统正常时,程序遇到的运行错。如数组越界、除数为0、操作数超出数据范围等、异常不是致命的,但会导致程序非正常终止,异常处理机制使程序自身能够捕获和处理异常。59.1.2Java异常处理机制异常(类):是指程序在运行过程中发生由于算法考虑不周或软件设计错误等导致的程序异常事件。抛出异常:在一个程序运行过程中,如果发生了异常事件,则产生一个代表该异常的对象,并把它提交给运行系统的过程称为抛出(throw)异常。捕获异常:异常抛出后,运行系统从生成异常对象的代码开始,沿方法的调用栈逐层回溯查找,直到找到包含相应异常处理的方法,并把异常对象提交给该方法为止,这个过程称为捕获(catch)异常。6异常对象可由应用程序本身产生,也可能由JVM产生7Method1Method2Method3Read-filecallcallcalltry-catch捕获异常抛出异常throwsthrowsthrowsJava异常处理机制--执行流程示意捕获异常可以放置在上述任何一个矩形之中。Java异常处理机制--异常类Java中定义了很多异常类,每个异常类代表一种运行错误,类中包含了该运行错误的信息和处理错误的方法等内容。每当Java程序运行过程中产生一个可识别的运行错误时,系统都会产生一个相应的该异常类的对象。Java采取“抛出-捕获”的方式,一旦一个异常对象产生了,系统就可以捕获这些异常,并且有相应的机制来处理它,确保不会产生死机、死循环或其他损害,从而保证了整个程序运行的安全性。这就是Java的异常处理机制。89.2异常处理类9一个异常是由一个对象来代表的,所有的异常都直接或间接地继承自Throwable类。在Java类库的每个类包中都定义了异常类,这些异常类分成两大类:Error类及Exception类,后者是Java程序中需要大量处理的。除了Java类库所定义的异常类之外,用户也可以通过继承已有的异常类来定义自己的异常类,并在程序中使用(利用throw产生,throws声明抛出,catch捕捉并处理)。10在“异常”类层次上的最上层有一个单独的类叫做Throwable,它是java.lang包中的一个类。java.lang.Error:由Java虚拟机生成并抛出,包括动态链接失败、虚拟机错误等,Java程序不做处理,必须交由操作系统处理。java.lang.Exception:供应用程序使用的,它是用户程序能够捕捉到的异常情况。Java编译器要求Java程序必须捕获或声明所有的非运行时异常。RuntimeException:Java虚拟机在运行时生成的异常,如被0除等系统错误、数组下标超范围等,其产生比较频繁,处理麻烦,对程序可读性和运行效率影响太大。由系统检测,用户可不做处理,系统将它们交给缺省的异常处理程序(当然,必要时,用户可对其处理)。1111异常类的层次结构(参看图9.1)ThrowableErrorExceptionRuntimeException缺省的异常处理程序由用户捕获或声明并处理不做处理用户自己产生的异常处理12一些常用的异常类Error(allinjava.lang)LinkageErrorThreadDeathVirtualMachineErrorInternalErrorOutOfMemoryErrorStackOverflowErrorUnknownErrorAWTError(injava.awt)…13Exception(injava.lang)ClassNotFoundExceptionCloneNotSupportedExceptionInterruptedException…RuntimeExceptionArithmeticExceptionClassCastExceptionInllegalArgumentExceptionInllegalThreadStateExceptionNumberFormatExceptionExceptionIOException(injava.io)CharConversionExceptionEOFExceptionFileNotFoundExceptionInterruptedIOException……14RuntimeExceptionInllegalMonitorStateExceptionInllegalStateExceptionIndexOutOfBoundsExceptionArrayIndexOutObBoundsExceptionStringIndexOutObBoundsExceptionNegativeArraySizeExceptionNullPointerExceptionSecurityException…EmptyStackException(injava.util)MissingResourceException(injava.util)NoSuchElementException(injava.util)…Exception构造方法:publicException();publicException(Strings);Exception常用方法:publicStringtoString():该方法返回描述当前Exception类信息的字符串。publicvoidprintStackTrace():该方法没有返回值,它的功能是完成一个输出操作,在当前的标准输出设备(一般是屏幕显示器)上输出当前异常对象的堆栈使用轨迹,即程序先后调用并执行了哪些对象或类的哪些方法,使得运行过程中产生了这个异常对象。通常是对该异常所对应的错误描述。15Exception类常用方法程序对错误与异常的处理方式有三种:一是程序不能处理的错误,交操作系统处理;二是程序应避免而可以不去捕获的运行时异常(RuntimeException);三是必须捕获(使用try-catch-final)的非运行时异常。169.3处理异常异常类异常处理是通过try、catch、finally、throw、throws五个关键字来实现的。使用try-catch-finally语句捕获和处理异常捕获异常的意义:能让程序来接收和处理异常对象,从而不影响其他语句的执行。17使用try-catch-finally语句捕获和处理异常捕获异常:当一个异常被抛出时,有专门的语句来接收这个被抛出的异常对象。当一个异常类的对象被捕获或接收后,用户程序就会发生流程跳转,系统终止当前的流转而跳转到专门的异常处理语句块,或直接跳出当前程序和JVM回到操作系统。18try-catch-finally语句语法格式:try{要检查的语句序列;//可能产生异常的语句}catch(异常类名形参对象名){异常发生时的处理语句;//捕获到某种异常对象时//进行处理的代码}finally{异常发生时一定会运行的语句}19try-catch-finally语句捕获和处理异常的顺序:try块中代码抛出异常,若发生异常,则程序的运行便中断,并抛出由“异常类”所产生的“对象”。同时,该代码块也指定了它后面的catch语句所捕获的异常的范围,每个catch块都应该与一个try语句块相对应,这个try语句块用来启动Java的异常处理机制。catch用来指定需要捕获的异常类型,捕获到异常,然后流程自动跳过产生异常的语句后面的所有尚未执行的语句,系统就直接跳到catch语句中,查看是否有匹配的异常类,若有就执行相应语句。20try-catch-finally语句捕获和处理异常的顺序:无论try程序块是否捕获到异常,或者捕获到的异常是否与catch后面括号里的异常相同,最后一定会运行finally块里的程序代码;finally块的代码运行结束后,程序再转到try-catch-finally块之后的语句继续运行。(finally块)若try块中所有的语句都没有引发异常,则所有的catch块都会被忽略而不执行。(catch块一定会被执行吗?)2122importjava.util.Scanner;publicclassDivide1{publicstaticintdivide(inta1,inta2){returna1/a2;//a2可能为0}publicstaticvoidmain(Stringargs[]){Scannerscanner=newScanner(System.in);System.out.print(Pleaseenteranintegernumerator:);intone=scanner.nextInt();System.out.print(Pleaseenteranintegerdenominator:);inttwo=scanner.nextInt();intresult=divide(one,two);System.out.printf(\nResult:%d/%d=%d\n,one,two,result);}}//这个例子会产生错误,但是没有处理机制,所以运行不稳定。一个例子23importjava.util.*;publicclassDivideOk{publicstaticintdivide(inta1,inta2)throwsArithmeticException{returna1/a2;}publicstaticvoidmain(Stringargs[]){Scannerscanner=newScanner(System.in);booleancontinueLoop=true;do{try{}catch(InputMismatchExceptioninputMismatchException){}catch(ArithmeticExceptionarithmeticException){}}while(continueLoop);}}//增加捕获异常语句,能够处理除数为零(a2为0)的程序增加异常捕获语句24do{try{System.out.print(“请输入被除数:);intone=scanner.nextInt();System.out.print(“请输入除数:);inttwo=scanner.nextInt();intresult=divide(one,two);System.out.printf(\nResult:%d/%d=%d\n,one,two,result);continueLoop=false;//inputsuccessful;endlooping}catch(InputMismatchExceptioninputMismatchException){System.err.printf(\nException:%s\n,inputMi
本文标题:Ja15-08第9章异常处理.
链接地址:https://www.777doc.com/doc-2880821 .html