欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

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

    • 资源ID:6509943       资源大小:303.50KB        全文页数:48页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

    Java程序设计,第九章 异常控制,学习目标,理解异常概念,清楚错误和异常的区别以及运行时异常和检测异常的差异了解程序中发生异常的根源,能够利用try/catch和finally处理异常能够自定义异常类掌握方法定义中的异常声明方法执行中抛出异常对象掌握异常处理的基本规则,9.1异常,1.什么是异常?在程序执行中,任何中断正常程序流程的异常条件就是错误或异常。例如,程序运行发生下列情况时,会出现异常:想打开的文件不存在网络连接中断接受了不符合逻辑的操作数系统资源不足问题:当程序执行中发生了这些事情后,如何处理呢?,讨论,一个打开文件,读取内容的过程可能发生的错误openTheFile指定的文件是否存在,能否打开(权限)allocate that much memory能否得到正确的文件长度,有无足够的内存容纳读入的数据read-File格式是否正确,能否正常读到内容(介质错误),没有权限closeTheFile是否能够正常关闭,例如通道连接是否正常,文件错误、被其他文件锁定等,以常规方法处理错误:,以常规方法处理错误存在的问题:大部分程序代码花在出错处理上了只把能够想到的错误考虑到,对以外的情况无法处理程序可读性差,大量的错误处理代码混杂在程序中出错返回信息量太少,无法更确切的了解错误状况或原因正常返回信息和错误返回信息混为一谈,int fileProcessor(String fileName)if(theFilesOpen)get 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;return errorCode;,2、Java中的异常,Java通过面向对象的方法来处理程序错误,在Java中,错误被称为例外(Exception),有时也把例外称为异常。在一个方法的运行过程中,如果发生了例外,则这个方法(或者是Java虚拟机)生成一个代表该例外的对象(包含了该例外的详细信息),并把它交给运行时系统,运行时系统寻找相应的代码来处理这一例外。我们把生成例外对象并把它提交给运行时系统的过程称为抛出(throw)一个例外。运行时系统在方法的调用栈中查找,从生成例外的方法开始进行回朔,直到找到包含相应例外处理的方法为止,这一个过程称为捕获(catch)一个例外。,用例外的形式处理错误:,Try,try openTheFile;determine its size;allocate that much memory;read-File;closeTheFile;catch(FileopenFailed e)dosomething;catch(SizeDetermineFailed e)dosomething;catch(MemoryAllocateFailed e)dosomething;catch(ReadFailed e)dosomething;catch(FileCloseFailed e)dosomething;finally dosomething;,Try中包含的是正常处理的代码,Catch用来捕获某类异常,并加以处理,每个catch捕获一类异常,无论是否有异常发生,均要执行的的代码,例外机制的优点:把错误处理代码从常规代码中分离出来按错误类型和差别分组对无法预测的错误的捕获和处理(基类)克服了传统方法的错误信息有限的问题(getMessage)把错误传播给调用堆栈,异常分类体系,Throwable 类是 Java 语言中所有错误或异常的超类。Throwable 包含了导致其发生的执行过程(可以理解为方法调用顺序)的快照,通过此信息可以追根求源到问题出现的原始位置。它还包含了给出有关错误更多信息的消息字符串。,Throwable类的主要方法,Throwable类的主要方法Throwable()Throwable(String message)String toString()注:返回的是“classname”:“getMessage()”String getMessage()String getLocalizedMessage()void printStackTrace()void printStackTrace(PrintStreams)void printStackTrace(PrintWriter s)Throwable fillInStackTrace(),Throwable 类的子类,错误类(Error)在Java 编程语言中,错误类(Error)定义被认为是不能恢复的严重错误条件(如资源耗尽等和虚拟机相关的问题)。在大多数情况下,当遇到这样的错误时,建议让程序中断,应用程序一般不对此问题进行处理。异常类(Exception)异常处理允许程序捕获异常(Exception),处理它们,然后继续程序执行。它是分层把关,因此,错误情况不会介入到程序的正常流程中。,Exception类的两个子类,RuntimeException 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。比如,如果数组索引不超出数组界限,那么,ArrayIndexOutOfBoundsException异常从不会抛出,这也适用于访问一个空值对象的属性或方法。因为一个正确设计和实现的程序从不出现这种异常,通常对它不做处理。RuntimeException 及Error被称为unchecked Exception其它异常表示一种预知的运行时困难,它通常由环境效果引起,一般称为Checked Exception。例如包括文件未找到或无效URL 异常(用户提供了一个错误的URL),两者都可能因为用户错误而出现,这就鼓励程序员去处理它们,因为不处理他们可能会导致意想不到的错误。注:JDK的api文档对每个方法可能出现的异常做了清楚的声明。,9.1.2 Java程序中的常见异常,public class ArrayException public static void main(String args)int arr=1,2,3,4,6,7;for(int i=0;iarr.length;i+)System.out.println(arri+arri+1);,public class Summer public static void sum(String op1,String op2)int sum=0,x=0,y=0;op1.trim();op2.trim();x=Integer.parseInt(op1);y=Integer.parseInt(op2);sum=x+y;return sum;System.out.println(sum=+sum);public static void main(String args)Summer.sum(10,20);,又一个关于异常的例子,注:NullPointerException是很多初学者经常碰到的异常,它的来源存在于程序中使用了未经赋值的实例变量(即变量尚未引用任何实际存在的对象),public class ExceptionDemo public static void main(String args)String str=null;System.out.println(str.length();,常用异常类,程序中的异常从哪里来,1、程序运行过程中,运行环境检测到错误抛出的异常。2、程序调用的方法可能会抛出异常。如:Integer类中的parseInt方法public static int parseInt(Strings)throws NumberFormatException如:File类的方法createTempFilepublic static File createTempFile(Stringprefix,Stringsuffix)throws IOException 注:异常对象包含有关异常的信息,包括它的类型和出错时程序的状态。,9.2异常处理,如果程序运行时抛出的不是Error类型或者RuntimeException类型的异常(包含它们的子类),则开发者必须处理该异常,处理方法一般有两种:将可能发生异常的语句包含在一个try/catch块中进行捕获处理。在方法声明时,声明该方法抛出异常,由调用该方法的代码接受处理,则方法本身不必处理。,捕获异常,如果程序运行时抛出的不是Error类型或者RuntimeException类型的异常(包含它们的子类),则开发者必须处理该异常,处理方法一般有两种:在方法内部提供处理异常的代码(try/catch),避免异常导致程序崩溃。按照方法声明的要求,可以将该异常继续抛出,由调用该方法的代码接收处理。注:当异常被抛到main方法中,而也得不到处理时,程序被非正常终止。,1.捕获异常机制,try/将可能抛出异常的语句放在此处 catch(ExceptionType1 e)/处理try代码块中抛出的MyExceptionType1类型的异 常实例e catch(ExceptionType1 e)/处理try代码块中抛出的MyExceptionType2类型的异常实例efinally/无论是否有异常抛出,此部分代码总是被最后执行,2处理运行环境抛出的异常,例如,为了避免送给sum方法(Summer类)null值,可以为sum加上try-catch,如:,public static int sum(String op1,String op2)int sum=0,x=0,y=0;try op1.trim();op2.trim();x=Integer.parseInt(op1);y=Integer.parseInt(op2);sum=x+y;System.out.println(sum=+sum);catch(NullPointerException e)System.out.println(不能给我一个null的参数!);return sum;,3处理调用方法(含构造函数)抛出的异常,import java.io.File;import java.io.IOException;import java.util.Scanner;public class FileExceptionDemo public void showFile(String fileName)Scanner reader=null;try File f=new File(fileName);reader=new Scanner(f);while(reader.hasNext()System.out.println(reader.next();catch(FileNotFoundException e)e.printStackTrace();public static void main(String args)FileException demo=new FileException();demo.showFile(g:/sys.txt);,public Scanner(Filesource)throws FileNotFoundException,总结try和catch一般要同时使用。catch必须紧挨着try代码块的结束位置之后,在这之间不允许出现任何语句。发生异常后,原有的正常执行流程被打断,转至异常处理部分,异常处理完毕,并不会接着原有的代码执行,而是继续顺序执行下去。finally部分对于异常处理不是必须的,可以省略。一个程序不可能同时出现1个以上的异常,当出现异常时,程序就会中止原来的程序流程,多异常情况下的catch,当try代码块中可能会抛出1到多个异常,如何处理这可能的多个异常呢?非常简单,就是,按照异常的包容性(子类在前,父类在后),把需要捕获后处理的异常对应的catch逐次排列即可。,多异常示例,public static void sum(String op1,String op2)int sum=0,x=0,y=0;try op1.trim();op2.trim();x=Integer.parseInt(op1);y=Integer.parseInt(op2);sum=x+y;System.out.println(sum=+sum);catch(NullPointerException e)System.out.println(不能给我一个null的参数!);catch(NumberFormatException e)System.out.println(也不能给我一个不是数值型的字符串参数!);,9.2.3 捕获所有异常,如果你对上述程序捕获到的异常数量还不够放心的话,可以用简单的方法捕获程序可能出现的所有异常。,public static void sum(String op1,String op2)int sum=0,x=0,y=0;try op1.trim();op2.trim();x=Integer.parseInt(op1);y=Integer.parseInt(op2);sum=x+y;System.out.println(sum=+sum);catch(NullPointerException e)System.out.println(不能给我一个null的参数!);catch(NumberFormatException e)System.out.println(也不能给我一个不是数值型的字符串参数!);catch(Exception e)System.out.println(呵呵,再也没有异常会被放掉了!);,问题:,上述捕获的异常都属于运行时异常,错误的原因来自于外部提供了错误的输入,虽然,sum方法捕获了他们,但是有两个问题请考虑:sum捕获了这些问题,真正处理了吗?调用sum的方法知道自己的错误码?结论:运行时异常一般不需捕获(在错误的源头加以避免)如果需要捕获异常,就需要针对性的处理异常方案如果方法捕获到异常,但又无法处理,就需要让调用者知道,即将异常报告给调用者,由调用者处理,9.2.4 finally语句,finally语句在try/catch/finally是一个可选的部分。finally语句定义一个总是执行的代码块,而不考虑异常是否被捕获。所以它提供了在try/catch代码块执行结束后的后处理机制。例如前面的FileExceptionDemo 中对于创建Scanner对象,应该向下面一样处理:,public void showFile(String fileName)Scanner reader=null;try File f=new File(fileName);reader=new Scanner(f);while(reader.hasNext()System.out.println(reader.next();catch(FileNotFoundException e)e.printStackTrace();finally if(reader!=null)reader.close();,关于finally如果try-catch后有finally,则它是try和catch执行后必经的处理一个try块可以不执行finally子句就能够退出的唯一方法是通过调用System.exit()方法来实现的。,异常发生后的程序流向,如果在try代码块执行中发生了异常,则寻找匹配的异常处理,执行对应异常的处理代码,然后如果有finally块,则执行,执行后顺序执行finally块以后的代码,中间任何地方都不会自动返回(即使在catch中恢复了正常条件,也不会再回到原来发生异常的try中继续执行),自定义异常,什么时候需要自定义异常当用户不能通过返回值向用户反馈程序处理中发生的错误情况时,可以通过抛出异常进行告知。用户定义异常是通过扩展Exception类或子类来创建的一种具有特殊用途的子类,这种异常类可以包含一个“普通”类所包含的任何东西。,9.3自定义异常,可检测异常可检测异常就是必须按照异常处理机制进行控制的异常。自定义一个检测异常是通过扩展Exception类或子类(非RuntimeException及其子类)来创建。非检测异常非检测异常继承于RuntimeException及其子类,程序可以对一个可能出现的非检测异常不必控制。,/程序9-4:一个检测异常,用于表明取款时账户余额不足public class InsufficientFundsException extends Exceptionpublic InsufficientFundsException(int balance)super(当前余额是+balance);,/程序9-5:一个非检测异常,即运行时异常,用于表明取款时账户余额不足public class InsufficientFundsException extends RuntimeExceptionpublic InsufficientFundsException(int balance)super(当前余额是+balance);,9.4方法声明抛出异常,语法(方法声明中的异常)type methodName(type para1,)throws Exception1,Exception2,public static int parseInt(Strings)throws NumberFormatException,注:如果一个方法可能抛出的异常属于运行时异常,则不必声明(不声明不等于不会抛出)一个方法可以声明抛出多种异常,之间用逗号分开;一个方法如果声明可能抛出checked Exception,则调用者必须负责处理如果调用者不想使用try-catch机制处理可能的checked Exception,则自己也需声明抛出异常,以便更高层负责处理,直至终止,声明方法抛出异常,注:一个方法可以抛出多个异常,异常之间用逗号隔开。一个方法在某个时刻只能抛出一个异常。,public int read()throws IOExceptionpublic void withDraw(intamount)throws InsufficientFundsException,LossExceptionpublic void login(String account,String password)throws AccountNotFoundException,PasswordMismatchException,运行时环境抛出异常,/程序9-1:改写的main方法,添加了必要的参数正确性验证public static void main(String args)int score=null;if(score!=null,/程序9-1:再改写的main方法,使用try-catch机制捕获异常public static void main(String args)int score=null;try int result=summer(score);catch(NullPointerException e)System.out.println(调用summer发生错误,原因:+e.getMessage();,在程序中编码抛出异常实例,public void withDraw(int amount)throws InsufficientFundsException if(amountthis.balance)throw new InsufficientFundsException(this.balance);elsethis.balance-=amount;,if(amountthis.balance)InsufficientFundsException ex=new InsufficientFundsException(balance);throw ex;else this.balance-=amount;,多异常抛出,public void withDraw(int amount)throws InsufficientFundsException,LossExceptionif(amountthis.balance)throw new InsufficientFundsException(this.balance);if(state.equals(loss)throw new LossException();this.balance-=amount;,覆盖继承自父类的方法时的异常问题,注意对于继承的方法,覆盖时,可以:可以减少或者不再抛出任何异常;可以将抛出的异常替换为该异常的子类,也可以在子类方法声明时,增加被覆盖方法抛出异常的子类。对于继承的方法,覆盖时,不可以:增加新的异常,而此异常并非父类方法声明中的任何一个异常的子类;不可抛出被覆盖方法抛出异常的父类异常。,课堂练习,补充下面的程序class Excep static void method()throws IOException throw new IOException();public static void main(String args)method();,9.5异常处理的基本规则,程序对捕获的异常一般有以下三种处理机制:捕获处理捕获不处理捕获再抛出,作为异常处理的最基本原则,就是对捕获到的异常要进行针对性处理 其他经验:1.将程序正常执行中可能发生的例外定义为异常,如登陆中的账号不存在、密码不匹配等。2.对捕获到的异常要有针对性处理,如错误恢复机制。不要捕获到异常,却没有任何实质意义的处理,异常并不是调试。3.分析可能出现异常的代码,不要将无关的代码放入try代码块中,求得心理安慰而使得try代码块变得过于庞大,这样做可能导致出现异常而无法确定异常的位置,因为有可能多个地方发出同样的异常。4.在一个代码块中,try/catch/finally即可以嵌套也可以出现并行情况。5.尽量不要使用Exception试图捕获所有的异常,要注意不同的异常要有针对性处理,不要把所有的异常放在一起处理。e.尽量利用异常而不是返回值来揭示程序执行中的状态,也不能用异常来代替简单的测试和逻辑判断。,public class TryMissingException public static void test()throws Exception try/1.抛出异常throw new Exception(Something error);catch(Exception e)/2.捕获的异常匹配,进入控制块System.out.println(Exception from e);/3.打印throw e;/4.return前控制转移到finally块,然后返回 finally System.out.println(executing finally block);return;/5.控制转移,直接返回,吃掉了异常,9.5.2 finally和renturn的关系,public class TryMissingException public static void main(String args)try TryMissingException.test();catch(Exception e)System.out.println(Exception from main);e.printStackTrace();public static void test()throws Exception,小结,1 异常什么是异常?异常就是标识程序中出现的错误。异常都是Throwable的子类对象。三类异常的区别Error类及其子类错误无法处理。RuntimeException类及其子类异常可以不用处理,也可选择性处理。其它类型的异常必须得到处理。,2 异常捕获处理将可能发生异常的语句放在try代码块中,来确保异常发生时能够得到捕获。catch语句块对捕获到的异常进行处理,也可继续抛出,交由调用者处理。finally的作用,一个trycatch执行后的统一执行语句块。一个try语句快中如果可能抛出多个异常时,catch语句块可以并列,但是其准备捕获的异常类型顺序应该注意:同一层次体系内的异常类,其层次越低,其捕获位置越靠前,不同层次的异常,其排列顺序无关。,3 自定义异常开发人员可以通过派生Exception及其子类来定义自己的异常类,用于对象业务环境中的某种错误类型。4 定义方法时声明可能抛出异常如果一个方法执行时抛出的异常不是Error类及其子类或者RuntimeException类及其子类,那么就必须在方法定义时用throws子句说明可能抛出的异常。可以使用throw语句在程序执行中任意需要的地方抛出异常,控制程序的流向。,课堂练习,1.下面的程序运行结果是什么?class ThisClassstatic void foo()throws Exception throw new Exception();public static void main(String args)try foo();catch(Exception e)System.exit(0);finally System.out.println(In finally);,2 完成下列要求,写一程序进行异常的验证。定义一个继承于Exception类的异常类InsufficientFundException定义一个银行账户类Account,包括:属性:账户名称name,String型 存款余额balance,double型构造函数:Account(String name,double balance);取款操作 方法void withdrawal(double amount),此方法在取款额大于余额时,将抛出InsufficientFundException,否则更新余额。,

    注意事项

    本文(Java程序设计-9-异常.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开