您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > Java编程异常处理
第六章异常1.异常的概念2.异常处理的方法3.java的异常类4.异常处理5.自定义异常的实现6.断言1.异常的概念由于硬件错误,资源耗尽以及输入错误的数据等,都可能导致程序运行时异常的产生.异常是运行时的错误.异常产生时会中断指令的正常执行.java异常是java提供的用于处理程序中错误的一种机制.所谓错误是在程序的运行过程中产生的一些异常事件.如:除0,数组下标越界,所要读取的文件不存在等.设计良好的程序都应该在异常发生时提供处理这些错误的方法,使得程序不会因为异常的发生而阻断或产生不可预见的结果,保障程序的键壮性.对于异常首先应该预计到所有可能出现的情况,然后考虑能否完全避免异常.如果不能完全避免再考虑异常发生时的具体处理办法.java程序在执行过程中如出现异常事件,可以生成一个异常对象,该异常对象封装了异常的信息。并提交给java运行时环境,这个过程称为抛出(throw)异常,当java运行时环境接收到异常对象时,会寻找能处理这一异常对象的代码,并把当前异常对象交给其处理,这一过程称为捕获(catch)异常.java默认处理异常的方式为直接把异常对象包装的信息打印到命令行上.当异常发生时注意观察错误的名字和行号.1.publicclassFirstException2.{3.publicstaticvoidmain(String[]args){4.inta=2/0;5.System.out.println(a=+a);6.}7.}1.publicclassTestException2.{3.publicstaticvoidmain(String[]args){4.int[]arr={1,2.,3};5.System.out.println(arr[3]);6.}7.}运行上面的程序看也java也错的机制.2.异常处理的方法当异常发生时,有两种处理方式:a.捕获b.异常抛出a.捕获.try-catch当异常发生时,通过异常的捕获可以来对发生的异常进行处理.try-catch方法:try{可能出现异常的代码}catch(异常类型1异常引用){异常类型1的处理代码}......catch(异常类型n异常引用){异常类型n的处理代码}注:1.try语句只能有一个,而catch语句块则可以有任意多个.catch语句块紧跟在try语句块之后,而且catch语句块必须相互紧跟,它们之间不能有任何代码.2.当在try语句块中发生异常时,程序将停止继续往下执行.系统会把它封装成一个异常类对象,并把它交给catch语句块(进入语句块)相对应的异常类型的异常引用进行处理.如果没有异常发生,程序正常运行不会进入任何一个catch语句块.b.异常抛出.不是所有异常在其产生的位置都能立即进行处理(没有捕获到或处理不了)异常抛出分为:显性再抛出和隐性再抛出将catch语句捕获的异常再次抛出,称为显性再抛出.如果只想把收到的异常再抛出,不必使用显性再抛出,使用隐性再抛出,只要在方法后用throws语句,方法内不用处理任何异常.两者异同:1.)若抛出的是捕获异常,隐性与显性再抛出都必须在方法声明中明确声明.2.)显性再抛出是在方法体中使用throw语句将产生的异常抛出.3.)隐性再抛出是在方法体中没有任何抛出异常的语句,若产生异常将自动抛出.3.java的异常类java类库中有一个java.lang.Throwable类,是所有异常类的超类.Throwable类有两个直接子类,Error与Exception类,Exception类有一个子类RuntimeException.其中Exception类的直接或间接子类,除去RuntimException类的直接或间接子类,称为捕获异常(必须处理的异常),其他的都为未捕获异常.ThrowableErrorException......(未捕获异常)RuntimeException......(捕获异常)......(未捕获异常)a.捕获异常(必须处理的异常)捕获异常一般是由外界因素产生的,即使程序本身没有问题,也有可能产生(也可能恢复),在开发时必须考虑如何处理,否则编译不通过.b.未捕获异常(不用处理的异常)除了捕获异常以外的部分都是未捕获异常,即Error类及其子类以及RuntimeException类及其子类.继承自Error的类一般代表由硬件运行失败导致的严重错误,而其从严格意义上讲,不属于异常,一般来讲,程序不能从Error中恢复。而RuntimeException类的子类通常是指一些程序运行时错误引起的异常,所以也可以不对其进行处理.4.异常处理4.1try-catch1.publicclassFirstException2.{3.publicstaticvoidmain(String[]args)4.{5.try{6.inta=2/0;7.System.out.println(a=+a);8.int[]ar=null;9.System.out.println(ar.length);10.}catch(ArithmeticExceptionae){11.ae.printStackTrace();12.}catch(NullPointerExceptionnp){13.np.printStackTrace();14.}catch(Exceptione){15.e.printStackTrace();16.}17.}18.}1.importjava.*;2.importjava.io.*;3.publicclassCatchException4.{5.publicstaticvoidmain(String[]args)6.{7.try{8.ServerSocketss=newServerSocket(8888);9.inti=2/0;10.}catch(Exceptionie){11.ie.printStackTrace();12.}13.}14.}4.2try-catch-finally1.publicclassTestFinally2.{3.publicstaticintget(){4.try{5.inta=2/0;6.System.out.println(try语句);7.return1;8.}catch(Exceptione){9.e.printStackTrace();10.System.out.println(catch语句);11.return2;12.}finally{13.System.out.println(finally语句);14.return3;15.}16.//System.out.println(try-catch外语句);17.}18.19.publicstaticvoidmain(String[]args)20.{21.System.out.println(get());22.}23.}4.3throw/throws1.publicclassThrowException2.{3.publicstaticvoidc(){4.int[]a=newint[3];5.a[8]=12;6.}7.8.publicstaticvoidb(){9.c();10.}11.12.publicstaticvoida(){13.try{14.b();15.}catch(ArrayIndexOutOfBoundsExceptionai){16.ai.printStackTrace();17.}18.}19.20.publicstaticvoidmain(String[]args)21.{22.a();23.System.out.println(程序正常执行!);24.}25.}1.publicclassThrowException12.{3.publicstaticvoidb()throwsArrayIndexOutOfBoundsException{4.try{5.int[]a=newint[3];6.a[8]=12;7.}catch(ArrayIndexOutOfBoundsExceptionai){8.throwai;//显性抛出异常9.}10.}11.12.publicstaticvoida(){13.try{14.b();15.}catch(RuntimeExceptionre){16.re.printStackTrace();17.}18.}19.20.publicstaticvoidmain(String[]args)21.{22.a();23.System.out.println(程序正常执行!);24.}25.}1.//如果只是想把收到的异常再抛出,不必使用显性再抛出,使用2.//隐性再抛出(比显性再抛出简单,效果是相同的)3.//对于捕获异常,显性和隐性都必须在方法声明中明确声明4.//显性再抛出,用throw语句,隐性再抛出方法体中没有任何抛出异常的语句5.//产生的异常自动抛出6.importjava.*;7.importjava.io.*;8.9.publicclassThrowException210.{11.publicstaticvoidmyFunction()throwsIOException{12.ServerSocketss=newServerSocket(8888);13.}14.15.publicstaticvoidmain(String[]args)16.{17.try18.{19.myFunction();20.}21.catch(IOExceptione)22.{23.e.printStackTrace();24.}25.System.out.println(程序正常运行结束!);26.}27.}1.//方法重写,要求重写后的方法一定不能声明抛出新的捕获异常或比原方法范畴更广的捕获异常2.classFather3.{4.publicvoidmyFunction()throwsException{5.System.out.println(父类抛出exception异常);6.}7.}8.9.classSonextendsFather10.{11.publicvoidmyFunction()throwsInterruptedException{12.int[]a=null;13.System.out.println(a.length);14.System.out.println(子类抛出interruptedException);15.}16.}17.18.publicclassOverWriteException19.{20.publicstaticvoidmain(String[]args)throwsException{21.Fatherf=newSon();22.f.myFunction();23.}24.}5.自定义异常的实现1.//自定义的异常可以继承自exception或其它的捕获异常类2.classAgeExceptionextendsException3.{4.publicAgeException(){5.}6.publicAgeException(Stringmsg){7.super(msg);8.}9.}10.11.publicclassPerson12.{13.privateintage;14.15.publicintgetAge(){16.returnthis.age;17.}18.19.publicvoidsetAge(intage)throwsAgeException{20.if(age=0){21.thrownewAgeException(年龄不能小于等于零!);22.}else{23.this.age=age;24.}25.}26.27.publicstaticvoidmain(String[]args){28.Personp=newPerson();29.try{30.p.setAge(100)
本文标题:Java编程异常处理
链接地址:https://www.777doc.com/doc-1842168 .html