Java程序设计-6-异常.ppt

上传人:wuy****n92 文档编号:70793402 上传时间:2023-01-28 格式:PPT 页数:43 大小:213KB
返回 下载 相关 举报
Java程序设计-6-异常.ppt_第1页
第1页 / 共43页
Java程序设计-6-异常.ppt_第2页
第2页 / 共43页
点击查看更多>>
资源描述

《Java程序设计-6-异常.ppt》由会员分享,可在线阅读,更多相关《Java程序设计-6-异常.ppt(43页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、JavaJava程序设计程序设计异常控制异常控制 学习目标学习目标理解异常理解异常理解异常抛出机制理解异常抛出机制应用应用try-catchtry-catch机制处理异常机制处理异常了解异常丢失现象了解异常丢失现象掌握方法定义中的异常声明掌握方法定义中的异常声明掌握方法执行中抛出异常的机制掌握方法执行中抛出异常的机制掌握自定义异常类掌握自定义异常类理解异常处理的基本规则理解异常处理的基本规则一一.异常处理基础异常处理基础 1.1.什么是异常?什么是异常?u在程序执行中,任何中断正常程序流程的异常在程序执行中,任何中断正常程序流程的异常条件就是错误或异常。例如,程序运行发生下条件就是错误或异常。

2、例如,程序运行发生下列情况时,会出现异常:列情况时,会出现异常:u想打开的文件不存在想打开的文件不存在u网络连接中断网络连接中断u接受了不符合逻辑的操作数接受了不符合逻辑的操作数u系统资源不足系统资源不足u当程序执行中发生了这些事情后,如何处理呢当程序执行中发生了这些事情后,如何处理呢?讨论讨论uopenTheFile;openTheFile;udetermine its size;determine its size;uallocate that much memory;allocate that much memory;uread-File;read-File;ucloseTheFilec

3、loseTheFile;以常规方法处理错误:以常规方法处理错误:openFiles;openFiles;if(theFilesOpen)if(theFilesOpen)udetermine the length of the file;determine the length of the file;uif(gotTheFileLength)if(gotTheFileLength)u allocate that much memory;allocate that much memory;u if(gotEnoughMemory)if(gotEnoughMemory)u read the fil

4、e into memory;read the file into memory;u if(readFailed)if(readFailed)u errorCode=-1;errorCode=-1;u else else u errorCode=-2;errorCode=-2;u elseelseu errorCode=-3;errorCode=-3;uelseelseu errorCode=-4;errorCode=-4;else else uerrorCode=-5;errorCode=-5;以常规方法处理错误存在的问题:以常规方法处理错误存在的问题:u观察前面的程序,大家会发现大部分精力花

5、在出错处理上了u只把能够想到的错误考虑到,对以外的情况无法处理u程序可读性差,大量的错误处理代码混杂在程序中u出错返回信息量太少,无法更确切的了解错误状况或原因u正常返回信息和错误返回信息混为一坛2 2、JavaJava中的异常中的异常uJavaJava通过面向对象的方法来处理程序错误,在通过面向对象的方法来处理程序错误,在JavaJava中,错中,错误被称为误被称为例外(例外(ExceptionException),),有时也把例外称为异常。有时也把例外称为异常。u在一个方法的运行过程中,如果发生了例外,则这个方法在一个方法的运行过程中,如果发生了例外,则这个方法(或者是(或者是JavaJa

6、va虚拟机)虚拟机)生成生成一个代表该例外的一个代表该例外的对象对象(包含(包含了该例外的详细信息),并把它交给运行时系统,运行时了该例外的详细信息),并把它交给运行时系统,运行时系统寻找相应的代码来处理这一例外。我们把生成例外对系统寻找相应的代码来处理这一例外。我们把生成例外对象并把它提交给运行时系统的过程称为象并把它提交给运行时系统的过程称为抛出抛出(throw)(throw)一个一个例外。例外。u运行时系统在方法的调用栈中查找,从生成例外的方法开运行时系统在方法的调用栈中查找,从生成例外的方法开始进行回朔,直到找到包含相应例外处理的方法为止,这始进行回朔,直到找到包含相应例外处理的方法为

7、止,这一个过程称为一个过程称为捕获捕获(catch)(catch)一个例外。一个例外。用例外的形式处理错误:用例外的形式处理错误:utrytry u openTheFile;openTheFile;u determine its size;determine its size;u allocate that much memory;allocate that much memory;u read-File;read-File;u closeTheFile closeTheFile;u ucatchcatch(fileopenFailed)(fileopenFailed)dosomething;

8、dosomething;ucatchcatch(sizeDetermineFailed)(sizeDetermineFailed)dosomething;dosomething;ucatchcatch(memoryAllocateFailed)(memoryAllocateFailed)dosomething;dosomething;ucatchcatch(readFailed)(readFailed)dosomething;dosomething;ucatchcatch(fileCloseFailed)(fileCloseFailed)dosomething;dosomething;ufin

9、allyfinally dosomething;dosomething;例外机制的优点:把错误处理代码从常规代码中分离出来把错误处理代码从常规代码中分离出来按错误类型和差别分组按错误类型和差别分组对无法预测的错误的捕获和处理(基类)对无法预测的错误的捕获和处理(基类)克服了传统方法的错误信息有限的问题克服了传统方法的错误信息有限的问题(getMessagegetMessage)把错误传播给调用堆栈把错误传播给调用堆栈一一.异常处理基础异常处理基础(cont.)(cont.)n2.Java2.Java的异常分类的异常分类uThrowable Throwable 类是类是 Java Java 语言

10、中所有错误或异常的超类。语言中所有错误或异常的超类。uError Error、RuntimeExceptionRuntimeException及其子类、其它异常表示一种及其子类、其它异常表示一种运行时的困难,它通常由环境因素引起,可以进行处理。运行时的困难,它通常由环境因素引起,可以进行处理。Throwable类的主要方法Throwable()Throwable(String message)String toString()u“classname”:“getMessage()”String getMessage()String getLocalizedMessage()void printS

11、tackTrace()void printStackTrace(PrintStreams)void printStackTrace(PrintWriter s)Throwable fillInStackTrace()Throwable Throwable 类的子类类的子类 在Java 编程语言中,错误类(Error)定义被认为是不能恢复的严重错误条件(如资源耗尽等和虚拟机相关的问题)。在大多数情况下,当遇到这样的错误时,建议让程序中断,应用程序一般不对此问题进行处理。异常处理允许程序捕获异常(Exception),处理它们,然后继续程序执行。它是分层把关,因此,错误情况不会介入到程序的正常流程

12、中。ExceptionException类的子类类的子类RuntimeException 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。比如,如果数组索引不超出数组界限,那么,ArrayIndexOutOfBoundsException异常从不会抛出,这也适用于访问一个空值对象的属性或方法。因为一个正确设计和实现的程序从不出现这种异常,通常对它不做处理。其它异常表示一种预知的运行时困难,它通常由环境效果引起,一般称为Checked Exception。例如包括文件未找到或无效URL 异常(用户提供了一个错误的URL),两者都可能因为用户错误而出现,这就鼓励程序员去

13、处理它们,因为不处理他们可能会导致意想不到的错误。常用异常类常用异常类异常类异常类原因原因ArithmeticException出现异常的运算条件时,抛出此异常。例出现异常的运算条件时,抛出此异常。例如,一个整数如,一个整数“除以零除以零”时,抛出此类的时,抛出此类的一个实例一个实例ArrayStoreException试图将错误类型的对象存储到一个对象数试图将错误类型的对象存储到一个对象数组时抛出的异常组时抛出的异常ClassCastException当试图将对象强制转换为不是实例的子类当试图将对象强制转换为不是实例的子类时,抛出该异常时,抛出该异常IndexOutOfBoundsExcep

14、tion指示某排序索引(例如对数组、字符串或指示某排序索引(例如对数组、字符串或向量排序)超出范围时抛出向量排序)超出范围时抛出NullPointerException当应用程序试图在需要对象的地方使用当应用程序试图在需要对象的地方使用 null 时,抛出该异常时,抛出该异常示例一示例一public class ExceptionDemo public class ExceptionDemo u public static void main(String args)public static void main(String args)u String str=null;String str

15、=null;u System.System.outout.println(str.length();.println(str.length();u 示例二示例二public class ExceptionDemo public class ExceptionDemo u public static void main(String args)public static void main(String args)u int divisor=10;int divisor=10;u double quotient=0d;double quotient=0d;u quotient=divisor/0

16、;quotient=divisor/0;u System.out.println(quotient=+quotient)System.out.println(quotient=+quotient);u String str=null;String str=null;u System.System.outout.println(str.length();.println(str.length();u 二、程序中的异常从哪里来二、程序中的异常从哪里来1 1、程序运行过程中,运行环境检测到错误抛出、程序运行过程中,运行环境检测到错误抛出的异常。的异常。2 2、程序调用的方法可能会抛出异常。、程序调用

17、的方法可能会抛出异常。u如:如:FileFile类的方法类的方法createTempFilecreateTempFileupublic static public static FileFile createTempFile(createTempFile(StringStringprefix,prefix,StringStringsuffix)suffix)throws IOExceptionthrows IOException 注:异常对象包含有关异常的信息,包括它的注:异常对象包含有关异常的信息,包括它的类型和出错时程序的状态。类型和出错时程序的状态。三三.捕获异常捕获异常 如果程序运行时

18、抛出的不是如果程序运行时抛出的不是ErrorError类型或者类型或者RuntimeExceptionRuntimeException类型的异常类型的异常(包含它们的子类包含它们的子类),则开发者必须处理该异常,处理方法一般有两,则开发者必须处理该异常,处理方法一般有两种:种:u在方法内部提供处理异常的代码在方法内部提供处理异常的代码(try/catch)(try/catch),避,避免异常导致程序崩溃。免异常导致程序崩溃。u按照方法声明的要求,可以将该异常继续抛出,由按照方法声明的要求,可以将该异常继续抛出,由调用该方法的代码接收处理。调用该方法的代码接收处理。1.1.捕获异常机制捕获异常机

19、制utrytry u /try /try代码块中的代码有可能抛出异常代码块中的代码有可能抛出异常u catchcatch(MyExceptionTypeMyExceptionType e e)u /处理处理trytry代码块中抛出的代码块中抛出的MyExceptionTypeMyExceptionType类型的异常实例类型的异常实例e eu finallyfinally u /无论是否有异常抛出,此部分代码总是无论是否有异常抛出,此部分代码总是被最后执行被最后执行u 2 2处理运行环境抛出的异常处理运行环境抛出的异常public class NullPointerExceptionDemo p

20、ublic class NullPointerExceptionDemo upublic static void main(String args)public static void main(String args)uString str=null;String str=null;uint length=0;int length=0;utrytry ulength=str.length();/length=str.length();/空值调用方法空值调用方法uSystem.System.outout.println(length);.println(length);u catch(Null

21、PointerException e)catch(NullPointerException e)uSystem.System.outout.println(Exception occured:+e);.println(Exception occured:+e);u uSystem.System.outout.println(“Completed!);.println(“Completed!);u 3 3处理调用方法抛出的异常处理调用方法抛出的异常public class HandleMthodException public class HandleMthodException upublic

22、 static void main(String args)public static void main(String args)u try try u File tmp=File.File tmp=File.createTempFilecreateTempFile(abc,log);(abc,log);u System.out.println(tmp.getAbsolutePath();System.out.println(tmp.getAbsolutePath();u catch(IOException e)catch(IOException e)u System.out.println

23、(e.getMessage();System.out.println(e.getMessage();u u 注:如果一个方法声明会抛出非运行时异常类的子类,注:如果一个方法声明会抛出非运行时异常类的子类,则调用该方法时,必须用捕获机制则调用该方法时,必须用捕获机制4.4.多异常情况下的多异常情况下的catchcatchu当当trytry代码块中可能会抛出代码块中可能会抛出1 1到多个异常,如何处到多个异常,如何处理这可能的多个异常呢?理这可能的多个异常呢?u非常简单,就是,非常简单,就是,按照异常的包容性按照异常的包容性(子类在前,子类在前,父类在后父类在后),把需要捕获后处理的异常对应的,把

24、需要捕获后处理的异常对应的catchcatch逐次排列即可。逐次排列即可。多异常示例多异常示例public class NullPointerExceptionDemo public class NullPointerExceptionDemo upublic static void main(String args)public static void main(String args)uString str=null;String str=null;uint length=0;int length=0;utrytryulength=str.length();length=str.lengt

25、h();uSystem.System.outout.println(length);.println(length);u catch(NullPointerExceptioncatch(NullPointerException e)e)uSystem.System.outout.println(Exception occured:+e);.println(Exception occured:+e);u catch(ArithmeticExceptioncatch(ArithmeticException e)e)uSystem.System.outout.println(Exception oc

26、cured:+e);.println(Exception occured:+e);u catch(Exceptioncatch(Exception e)e)uSystem.System.outout.println(Exception occured:+e);.println(Exception occured:+e);u u 5.finally5.finally语句语句finallyfinally语句在语句在try/catch/finallytry/catch/finally是一个可选的部分。是一个可选的部分。finallyfinally语句定义一个总是执行的代码块,而不考虑异常语句定义一个

27、总是执行的代码块,而不考虑异常是否被捕获。所以它提供了在是否被捕获。所以它提供了在try/catchtry/catch代码块执行结束代码块执行结束后的后处理机制。下面一个用户登录验证的模拟过程:后的后处理机制。下面一个用户登录验证的模拟过程:trytryu查找用户查找用户;u匹配密码匹配密码catch(AccountNotFoundException e)catch(AccountNotFoundException e)u处理没有发现账号的异常处理没有发现账号的异常;catch(PasswordMismatchException e)catch(PasswordMismatchExceptio

28、n e)u处理账号密码不匹配的异常处理账号密码不匹配的异常;finallyfinally u登记本次访问登记本次访问;示例程序示例程序注意:一个注意:一个trytry块可以不执行块可以不执行finallyfinally子句就能子句就能够退出的唯一方法是通过调用够退出的唯一方法是通过调用System.exit()System.exit()方方法来实现的。法来实现的。6 6 捕获所有异常捕获所有异常catch(Exception e)catch(Exception e)u public class TryMissingException public class TryMissingExcepti

29、on upublic static void test()throws Exception public static void test()throws Exception utrytry u/1./1.抛出异常抛出异常uthrow new Exception(Something error);throw new Exception(Something error);u catchcatch(Exception e)(Exception e)u/2./2.捕获的异常匹配,进入控制块捕获的异常匹配,进入控制块uSystem.System.outout.println(Exception fro

30、m e);/3.println(Exception from e);/3.打印打印uthrow e;/4.returnthrow e;/4.return前控制转移到前控制转移到finallyfinally块块,然后返回然后返回u finallyfinally uSystem.System.outout.println(executing finally block);.println(executing finally block);ureturnreturn;/5.;/5.控制转移,直接返回,吃掉了异常控制转移,直接返回,吃掉了异常u u 7.7.丢失的异常丢失的异常public class

31、 TryMissingException public class TryMissingException upublic static void main(String args)public static void main(String args)utrytry uTryMissingException.TryMissingException.testtest();();u catchcatch(Exception e)(Exception e)uSystem.System.outout.println(Exception from main);.println(Exception fr

32、om main);ue.printStackTrace();e.printStackTrace();u u upublic static void test()public static void test()throwsthrows ExceptionException u 课堂练习课堂练习补充下面的程序补充下面的程序uclass Excepclass Excepu static void method()throws Exception static void method()throws Exceptionu throw new EOFException();throw new EOFE

33、xception();u u public static void main(String args)public static void main(String args)u try tryu method();method();u catch()catch()u u u 四四.自定义异常自定义异常用户定义异常是通过用户定义异常是通过扩展扩展ExceptionException类或子类类或子类来创建的一种具有特殊用途的子类,这种异常来创建的一种具有特殊用途的子类,这种异常类可以包含一个类可以包含一个“普通普通”类所包含的任何东西。类所包含的任何东西。一个自定义的异常类一个自定义的异常类pub

34、lic class AccountNotFoundException extends public class AccountNotFoundException extends ExceptionException uString account;String account;upublic AccountNotFoundException()public AccountNotFoundException()usuper(This account has not found.);super(This account has not found.);u upublic AccountNotFou

35、ndException(String account)public AccountNotFoundException(String account)usuper(This account about +account+has not found.);super(This account about +account+has not found.);uthis.account=account;this.account=account;u upublic void getAccount()public void getAccount()ureturn this.account;return thi

36、s.account;u 五五.方法声明中的异常列表方法声明中的异常列表1.1.方法声明中的异常方法声明中的异常utype methodName(type para1,)type methodName(type para1,)u throwsthrows Exception1,Exception2 Exception1,Exception2 u u 如:如:upublic void login(String account,String public void login(String account,String password)password)throws AccountNotFound

37、Exceptionthrows AccountNotFoundException u u public void login(String account,String public void login(String account,String password)password)throwsthrows AccountNotFoundExceptionAccountNotFoundException,PasswordMismatchExceptionPasswordMismatchException 注:注:u一个方法可以抛出多个异常,异常之间用逗号隔开。一个方法可以抛出多个异常,异常之

38、间用逗号隔开。u一个方法在某个时刻只能抛出一个异常。一个方法在某个时刻只能抛出一个异常。2.2.在程序中编码抛出异常实例在程序中编码抛出异常实例public class AccountNotFoundException extends public class AccountNotFoundException extends Exception Exception uString account;/String account;/保存用户输入的帐号名保存用户输入的帐号名upublic AccountNotFoundException()public AccountNotFoundExcepti

39、on()u super(This account has not found.);super(This account has not found.);u upublic AccountNotFoundException(String account)public AccountNotFoundException(String account)usuper(This account about +account+has not found.);super(This account about +account+has not found.);uthis.account=account;this

40、.account=account;u public class User public void login(String account,String password)throws AccountNotFoundException,PasswordMismatchException boolean accountExisted=false;/默认帐号不存在 String otherPassword;/此处可插入查询帐号的代码 if(accountExisted)/如果帐号不存在,抛出异常,程序中断 throw new AccountNotFoundException(account);pu

41、blic static void main(String args)User user=new User();try user.login(account,password);catch(AccountNotFoundException e)/插入处理帐号不存在的代码 System.out.println(e.getMessage();System.exit(-1);/插入登陆成功的代码六六.异常处理的基本规则异常处理的基本规则 作为异常处理的最基本原则,就是对捕获到的异常作为异常处理的最基本原则,就是对捕获到的异常要进行针对性处理要进行针对性处理 几条经验几条经验1.1.将程序正常执行中可能

42、发生的例外定义为异常,如登陆中的将程序正常执行中可能发生的例外定义为异常,如登陆中的账号不存在、密码不匹配等。账号不存在、密码不匹配等。2.2.对捕获到的异常要有针对性处理,如错误恢复机制。不要捕对捕获到的异常要有针对性处理,如错误恢复机制。不要捕获到异常,却没有任何实质意义的处理,异常并不是调试。获到异常,却没有任何实质意义的处理,异常并不是调试。3.3.分析可能出现异常的代码,不要将无关的代码放入分析可能出现异常的代码,不要将无关的代码放入trytry代码代码块中,求得心理安慰而使得块中,求得心理安慰而使得trytry代码块变得过于庞大,这样做代码块变得过于庞大,这样做可能导致出现异常而无

43、法确定异常的位置,因为有可能多个地可能导致出现异常而无法确定异常的位置,因为有可能多个地方发出同样的异常。方发出同样的异常。4.4.在一个代码块中,在一个代码块中,try/catch/finallytry/catch/finally即可以嵌套也可以出即可以嵌套也可以出现并行情况。现并行情况。5.5.尽量不要使用尽量不要使用ExceptionException试图捕获所有的异常,要注意不同试图捕获所有的异常,要注意不同的异常要有针对性处理,不要把所有的异常放在一起处理。的异常要有针对性处理,不要把所有的异常放在一起处理。e.e.尽量利用异常而不是返回值来揭示程序执行中的状态,也不尽量利用异常而不

44、是返回值来揭示程序执行中的状态,也不能用异常来代替简单的测试和逻辑判断。能用异常来代替简单的测试和逻辑判断。小结小结1 1 异常异常u什么是异常?异常就是标识程序中出现的错什么是异常?异常就是标识程序中出现的错误。误。u异常都是异常都是ThrowableThrowable的子类对象。的子类对象。u三类异常的区别三类异常的区别uErrorError类及其子类错误无法处理。类及其子类错误无法处理。uRuntimeExceptionRuntimeException类及其子类异常可以不用处理,类及其子类异常可以不用处理,也可选择性处理。也可选择性处理。u其它类型的异常必须得到处理。其它类型的异常必须得

45、到处理。2 2 异常捕获处理异常捕获处理u将可能发生异常的语句放在将可能发生异常的语句放在trytry代码块中,来确保异代码块中,来确保异常发生时能够得到捕获。常发生时能够得到捕获。ucatchcatch语句块对捕获到的异常进行处理,也可继续抛语句块对捕获到的异常进行处理,也可继续抛出,交由调用者处理。出,交由调用者处理。ufinallyfinally的作用,一个的作用,一个trytrycatchcatch执行后的统一执行执行后的统一执行语句块。语句块。u一个一个trytry语句快中如果可能抛出多个异常时,语句快中如果可能抛出多个异常时,catchcatch语语句块可以并列,但是其准备捕获的异

46、常类型顺序应该句块可以并列,但是其准备捕获的异常类型顺序应该注意:注意:u同一层次体系内的异常类,其层次越低,其捕获位置同一层次体系内的异常类,其层次越低,其捕获位置越靠前,不同层次的异常,其排列顺序无关。越靠前,不同层次的异常,其排列顺序无关。3 3 自定义异常自定义异常u开发人员可以通过派生开发人员可以通过派生ExceptionException及其子类来定及其子类来定义自己的异常类,用于对象业务环境中的某种义自己的异常类,用于对象业务环境中的某种错误类型。错误类型。e e 定义方法时声明可能抛出异常定义方法时声明可能抛出异常u如果一个方法执行时抛出的异常不是如果一个方法执行时抛出的异常不

47、是ErrorError类及类及其子类或者其子类或者RuntimeExceptionRuntimeException类及其子类,那类及其子类,那么就必须在方法定义时用么就必须在方法定义时用throwsthrows子句说明可能子句说明可能抛出的异常。抛出的异常。u可以使用可以使用throwthrow语句在程序执行中任意需要的地语句在程序执行中任意需要的地方抛出异常,控制程序的流向。方抛出异常,控制程序的流向。课堂练习课堂练习1.1.下面的程序运行结果是什么?下面的程序运行结果是什么?class ThisClassclass ThisClassustatic void foo()throws Exc

48、eptionstatic void foo()throws Exceptionu throw new Exception();throw new Exception();u upublic static void main(String args)public static void main(String args)u try tryu foo();foo();u catch(Exception e)catch(Exception e)u System.exit(0);System.exit(0);u u finally finallyu System.out.println(In fina

49、lly);System.out.println(In finally);u u 2 2 完成下列要求,写一程序进行异常的验证。完成下列要求,写一程序进行异常的验证。u定义一个继承于定义一个继承于ExceptionException类的异常类类的异常类InsufficientFundExceptionInsufficientFundExceptionu定义一个银行账户类定义一个银行账户类AccountAccount,包括:,包括:u属性:账户名称属性:账户名称namename,StringString型型u 存款余额存款余额balancebalance,doubledouble型型u构造函数:构造函数:Account(String name,double balance);Account(String name,double balance);u取款操作取款操作 方法方法void withdrawal(double amount)void withdrawal(double amount),此,此方法在取款额大于余额时,将抛出方法在取款额大于余额时,将抛出InsufficientFundExceptionInsufficientFundException,否则更新余额。,否则更新余额。下一节课:下一节课:常用类编程常用类编程

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com