JAVA异常(1).ppt

上传人:文库蛋蛋多 文档编号:2477378 上传时间:2023-02-19 格式:PPT 页数:38 大小:238.50KB
返回 下载 相关 举报
JAVA异常(1).ppt_第1页
第1页 / 共38页
JAVA异常(1).ppt_第2页
第2页 / 共38页
JAVA异常(1).ppt_第3页
第3页 / 共38页
JAVA异常(1).ppt_第4页
第4页 / 共38页
JAVA异常(1).ppt_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《JAVA异常(1).ppt》由会员分享,可在线阅读,更多相关《JAVA异常(1).ppt(38页珍藏版)》请在三一办公上搜索。

1、异常处理,目标,简介异常处理throw、throws异常的继承架构总结,一个程序的编写的过程中,避免程序执行时的错误,往往占了程序开发时程的绝大多数时间,对于避免程序执行时的错误,Java 提供了异常处理机制。,在还没有学习异常处理之前,如果您要编写一个除法程序,并由使用者输入除数与被除数,由于被除数除以0没有意义,所以之前可能必须像以下这样避免错误:if(b!=0)System.out.println(a/b);else System.out.println(除数不能为0);,这样的方式过去在一些程序语言中会很常被利用,利用判断条件来避免错误的发生,然而这样的方式会让错误处理与程序的处理逻辑

2、混在一起,使得程序难以阅读,而 由于使用了一些判断条件,即使有一些很少发生的错误,也都必须一视同仁的进行判断检查,这会使得程序的执行效能受到一定程度的影响。,Java的异常处理机制可以协助我们捕捉程序执行时期的错误,它用来处理一些系统可以恢复的错误,异常(Exception)是Java中定义的一种对象数据型态,在特定错误发生时会丢出异常对象,我们可以捕捉这些异常并加以处理,避免程序可能的错误发生。,Java的异常处理藉由try、catch、finally三个关键词组合的语言来达到,其语法基本结构如下:try/陈述句catch(异常类型 名称)/异常处理finally/一定会处理的区块,一个“t

3、ry”所包括的区块,必须有对应的“catch”区块,它可以有多个“catch”区域,而“finally”可有可无,如果没有定义“catch”区块,则一定要有“finally”区块。建议:大家在编写异常时,多使用 finally,import java.io.*;public class UseException public static void main(String args)try int input;BufferedReader buf=new BufferedReader(new InputStreamReader(System.in);System.out.print(请输入整数

4、:);input=Integer.parseInt(buf.readLine();System.out.println(input x 10=+(input*10);catch(IOException e)System.out.println(I/O错误);catch(NumberFormatException e)System.out.println(输入格式有误);,异常处理是程序在执行但发生错误并无法处理时,会丢出一个异常对象,在这个程序中,您特意 使用 BufferedReader 取得输入,当使用 BufferedReader类别时,若发生I/O错误会丢出IOException异常,

5、这个异常您必须处理。,您试着从使用者输入取得一个整数值,由BufferedReader对象所读取到的输入是个字符串,您使用Integer类别的 parseInt()方法试着剖析该字符串为整数,如果无法解析,则会发生错误并丢出一个NumberFormatException异常对象,当这个异常丢出后,程序会离开目前执行的位置,而如果设定的“catch”有捕捉这个异常,则会执行对应区块中的陈述句,注意当异常一但抛出,就不会再回到异常的抛出点了。,如果程序中设定有“finally”区块,则无论异常是否有发生,则一定会执行“finally”区块中所定义的陈述句,“finally”区块使用时机 的例子之一

6、,就是当您开启了某个文件时,在读/写的过程中发生错误,在使用“catch”区块处理相对应的异常之后,最后在“finally”区块中定义 一些关闭文件的动作,让关闭文件的动作一定会被执行。,使用异常处理的好处是您可以将程序逻辑与错误处理分开,使得程序易于编写、阅读与维护,由于异常处理是在程序执行时发生错误,而没有办法处理之时才产生异常对象,所以与使用判断式来避免异常的方式比起来,异常处理会有比较好的执行效能。,当程序发生错误而无法处理的时候,会抛出对应的异常对象,除此之外,在某些时刻,您可能会想要自行抛出异常,例如在异常处理结束后,再将异常抛出,让下一层异常处理区块来捕捉,若想要自行抛出异常,您

7、可以使用throw关键词,并生成指定的异常对象,例如:throw new ArithmeticException();,举个例子来说明,在Java的除法中,允许除数为浮点数0.0,所得到的是Infinity,即无穷数,如果您想要自行检验除零错误,可以自行丢出异常,最接近这个条件的是ArithmeticException,当除数为整数且为0时,就会引发这个异常,您可以如下抛出异常:,public class UseThrow public static void main(String args)double dblzero=0.0;try System.out.println(浮点数除以零:+

8、(100/dblzero);if(dblzero=0)throw new ArithmeticException();catch(ArithmeticException e)System.out.println(发生除零异常);,每个异常都必须有一个“catch”区块来捕捉,在try.catch时,必须注意该异常是由何者引发并由何者捕捉。public class UseThrow public static void main(String args)try try throw new ArrayIndexOutOfBoundsException();catch(ArrayIndexOutOf

9、BoundsException e)System.out.println(ArrayIndexOutOfBoundsException/内层try-catch);,throw new ArithmeticException();catch(ArithmeticException e)System.out.println(发生ArithmeticException);catch(ArrayIndexOutOfBoundsException e)System.out.println(ArrayIndexOutOfBoundsException/外层try-catch);,在这个程序中,ArrayI

10、ndexOutOfBoundsException由内层try-catch丢出并捕捉,由于内层 已经捕捉了异常,所以外层的try-catch中之ArrayIndexOutOfBoundsException并不会捕捉到内层所丢出的异常,但如果 内层的try-catch并没有捕捉到这个异常,则外层try-catch就有机会捕捉这个异常,例如:,public class UseThrow public static void main(String args)try try throw new ArrayIndexOutOfBoundsException();catch(ArithmeticExcep

11、tion e)System.out.println(ArrayIndexOutOfBoundsException/内层try-catch);throw new ArithmeticException();catch(ArithmeticException e)System.out.println(发生ArithmeticException);catch(ArrayIndexOutOfBoundsException e)System.out.println(ArrayIndexOutOfBoundsException/外层try-catch);,程序中会定许多方法(Method),这些方法中可能

12、会因某些错误而引发异常,但您不希望直接在这个方法中处理这些异常,而希望调用这个它的方法来统一处理,这时候您可以使用“throws”关键词来声明这个方法将会抛出异常,例如:private void arrayMethod(int arr)throws ArrayIndexOutOfBoundsException,ArithmeticException/操作,注意如果会抛出多种可能的异常时,中间使用逗点分隔;当有方法上使用“throws”声明异常时,意味着调用该方法的调用者必须处理这些异常,而被调用方法可以保持程序逻辑的简洁,下面这个范例是throws的一个简单示范:,public class U

13、seThrows public static void main(String args)try throwsTest();catch(ArithmeticException e)System.out.println(捕捉异常);private static void throwsTest()throws ArithmeticException System.out.println(这只是一个测试);/程序处理过程假设发生异常 throw new ArithmeticException();,简单的说,您要不就在方法中直接处理异常,要不就在方法上声明该方法会抛出异常,由调用它的调用者来处理异常

14、,另一方面,在方法上使用“throws”声明可抛出的异常,也表示了您只能抛出所声明类型的异常,其它的异常您必须在方法中处理完,或是重新包装为所声明的异常再抛出。,如果使用继承时,在父类别的某个方法上宣告了throws某些异常,而在子类别中重新定义该方法时,您可以:不处理异常(重新定义时不设定throws)可仅throws父类别中被重新定义的方法上之某些异常可throws被重新定义的方法上之异常之子类别但是您不可以:throws出额外的异常throws被重新定义的方法上之异常之父类别,java的异常处理机制并不是只有将程序逻辑与异常处理分开的好处,程序设计的错误情况很多且难以估计,并没有人能保证

15、自已所设计的程序完全无误,异常处理最重要的是为程序设计人员提供种种可能的异常情况,让程序设计人员能够掌握并设法排除。Java编译器会检查程序语法等的相关错误,这些错误是属于编译时期错误,然而语法无误并不代表程序逻辑没有错误,逻辑上的错误会在程序执行时发生,这是属于执行时期错误,而即使逻辑没有错误,也可能因为I/O、网络或甚至内存不足等情况而发生错误。,Java所处理的异常主要可分为两大类,一种是严重的错误,例如硬件错误或内存不足等问题,与此相关的类别是位于java.lang下的Error类别;另一种是非严重的错误,代表可以处理的状况,与此相关的是位于java.lang下的Exception类别

16、。,Error类别与Exception类别都继承自Throwable类别,Throwable类别拥有几个报告相关异常讯息的方法:除了使用这些方法之外,我们也可以利用toString()取得异常对象的错误描述。,您所处理的异常通常都是衍生自Exception类别,其中大部份是执行时期异常(RuntimeException),例如 ArithmeticException、ArrayIndexOutOfBoundsException等等,另外还有一些非执行时期异常,例如 ClassNotFoundException(尝试加载类别时失败所引发,例如类别不存在)、InterruptedException

17、(执行绪非 执行中而尝试中断所引发的异常)等等,以下列出一些重要的继承架构:,ThrowableError(严重的系统错误)LinkageErrorThreadDeathVirtualMachineError.ExceptionClassNotFoundExceptionCloneNotSupportedExceptionIllegalAccessException.RuntimeException(执行时期异常)ArithmeticExceptionArrayStoreExceptionClassCastException,属于RuntimeException衍生出来的类别,是在执行时期会发

18、生的,不需要特别使用try-catch或是在函数上使用“throws”宣告也 可以通过编译,例如您在使用数组时,并不一定要处理ArrayIndexOutOfBoundsException异常。Exception下非RuntimeException衍生之异常如果有引发的可能性,则您一定要在程序中明确的指定处理才可以通过编译,例如当您使用 到BufferedReader类别时,由于有可能引发IOException,您要不就在try-catch中处理,要不就在函数上使用throws表 示由呼叫它的函数来处理。,了解异常处理的继承架构是必须的,例如在捕捉异常对象时,如果父类别异常对象撰写在子类别异常对

19、象之前被捕捉,则catch子类别异常对象的区块将永远不会被执行,事实上编译器也会帮您检查这个错误请大家来预测下面的程序的结果,import java.io.*;public class UseException public static void main(String args)try throw new ArithmeticException(异常测试);catch(Exception e)System.out.println(e.toString();catch(ArithmeticException e)System.out.println(e.toString();,这个程序若在编

20、译时将会产生以下的错误信息:UseException.java:11:exception java.lang.ArithmeticException has already been caughtcatch(ArithmeticException e)1 error,要完成这个程序的编译,您必须更改异常对象捕捉的顺序,例如:import java.io.*;public class UseException public static void main(String args)try throw new ArithmeticException(异常测试);catch(ArithmeticEx

21、ception e)System.out.println(e.toString();catch(Exception e)System.out.println(e.toString();,在编写程序时,您也可以如上将Exception异常对象的捕捉编写在最后,以便捕捉到所有尚未考虑到的异常,并进一步改进程序。如果您要自订自已的异常类别,您可以继承Exception类别而不是Error,Error是属于严重的系统错误,您不用去处理它,您也可以继承 RuntimeException类别,就如之前所说过的,这个异常不一用明确使用try-catch来处理也可以通过编译,但通常建议的是继承 Excepti

22、on,至少这样的程序会是比较安全的,对于可处理的这些异常,您在程序中必须明确的解决它,如果没有,编译器会告诉您。,一些程序会自行继承相关的异常类别,包括一些相关的异常讯息,它们也会在定义接口(interface)时于方法上声明throws某些类型的异常,然而 如果您在这些方法中发生了某些不是方法声明的异常(可能由于使用的底层技术不同而有这种情况),您就无法将之throw,只能自行编写一些try.catch来暗自处理掉,如果想要让这些异常丢出至上层,就要更多道的手续了,例如编写一个类继承RuntimeException,在发生异常时将该异常包装至这个RuntimeException类中,然后再丢出。,总结,大家学习了如何使用异常,来增强我们程序的健壮性在我们的实际编码过程中,异常也是一个很重要的组成部分希望大家善于利用异常的特性,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号