Java程序设计-6-异常.ppt_第1页
Java程序设计-6-异常.ppt_第2页
Java程序设计-6-异常.ppt_第3页
Java程序设计-6-异常.ppt_第4页
Java程序设计-6-异常.ppt_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java程序设计,异常控制,学习目标,理解异常 理解异常抛出机制 应用try-catch机制处理异常 了解异常丢失现象 掌握方法定义中的异常声明 掌握方法执行中抛出异常的机制 掌握自定义异常类 理解异常处理的基本规则,一. 异常处理基础,1.什么是异常? 在程序执行中,任何中断正常程序流程的异常条件就是错误或异常。例如,程序运行发生下列情况时,会出现异常: 想打开的文件不存在 网络连接中断 接受了不符合逻辑的操作数 系统资源不足 当程序执行中发生了这些事情后,如何处理呢?,讨论,openTheFile; determine its size; allocate that much memory; read-File; closeTheFile;,以常规方法处理错误:,openFiles; if (theFilesOpen) determine 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;,以常规方法处理错误存在的问题: 观察前面的程序,大家会发现大部分精力花在出错处理上了 只把能够想到的错误考虑到,对以外的情况无法处理 程序可读性差,大量的错误处理代码混杂在程序中 出错返回信息量太少,无法更确切的了解错误状况或原因 正常返回信息和错误返回信息混为一坛,2、Java中的异常 Java通过面向对象的方法来处理程序错误,在Java中,错误被称为例外(Exception),有时也把例外称为异常。 在一个方法的运行过程中,如果发生了例外,则这个方法(或者是Java虚拟机)生成一个代表该例外的对象(包含了该例外的详细信息),并把它交给运行时系统,运行时系统寻找相应的代码来处理这一例外。我们把生成例外对象并把它提交给运行时系统的过程称为抛出(throw)一个例外。 运行时系统在方法的调用栈中查找,从生成例外的方法开始进行回朔,直到找到包含相应例外处理的方法为止,这一个过程称为捕获(catch)一个例外。,用例外的形式处理错误:, try openTheFile; determine its size; allocate that much memory; read-File; closeTheFile; catch(fileopenFailed) dosomething; catch(sizeDetermineFailed) dosomething; catch(memoryAllocateFailed) dosomething; catch(readFailed) dosomething; catch(fileCloseFailed) dosomething; finally dosomething; ,例外机制的优点:,把错误处理代码从常规代码中分离出来 按错误类型和差别分组 对无法预测的错误的捕获和处理(基类) 克服了传统方法的错误信息有限的问题(getMessage) 把错误传播给调用堆栈,一. 异常处理基础(cont.),2.Java的异常分类 Throwable 类是 Java 语言中所有错误或异常的超类。 Error 、RuntimeException及其子类、其它异常表示一种运行时的困难,它通常由环境因素引起,可以进行处理。,Throwable类的主要方法,Throwable() Throwable(String message) String toString() “classname” : “getMessage()” String getMessage() String getLocalizedMessage() void printStackTrace() void printStackTrace(PrintStream s) void printStackTrace(PrintWriter s) Throwable fillInStackTrace(),Throwable 类的子类,在Java 编程语言中,错误类(Error)定义被认为是不能恢复的严重错误条件(如资源耗尽等和虚拟机相关的问题)。在大多数情况下,当遇到这样的错误时,建议让程序中断,应用程序一般不对此问题进行处理。 异常处理允许程序捕获异常(Exception),处理它们,然后继续程序执行。它是分层把关,因此,错误情况不会介入到程序的正常流程中。,Exception类的子类,RuntimeException 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。比如,如果数组索引不超出数组界限,那么,ArrayIndexOutOfBoundsException异常从不会抛出,这也适用于访问一个空值对象的属性或方法。因为一个正确设计和实现的程序从不出现这种异常,通常对它不做处理。 其它异常表示一种预知的运行时困难,它通常由环境效果引起,一般称为Checked Exception。例如包括文件未找到或无效URL 异常(用户提供了一个错误的URL),两者都可能因为用户错误而出现,这就鼓励程序员去处理它们,因为不处理他们可能会导致意想不到的错误。,常用异常类,示例一,public class ExceptionDemo public static void main(String args) String str=null; System.out.println(str.length(); ,示例二,public class ExceptionDemo public static void main(String args) int divisor=10; double quotient=0d; quotient=divisor/0; System.out.println(“quotient=“+quotient); String str=null; System.out.println(str.length(); ,二、程序中的异常从哪里来,1、程序运行过程中,运行环境检测到错误抛出的异常。 2、程序调用的方法可能会抛出异常。 如:File类的方法createTempFile public static File createTempFile(String prefix, String suffix) throws IOException 注:异常对象包含有关异常的信息,包括它的类型和出错时程序的状态。,三.捕获异常,如果程序运行时抛出的不是Error类型或者RuntimeException类型的异常(包含它们的子类),则开发者必须处理该异常,处理方法一般有两种: 在方法内部提供处理异常的代码(try/catch),避免异常导致程序崩溃。 按照方法声明的要求,可以将该异常继续抛出,由调用该方法的代码接收处理。,1.捕获异常机制,try / try代码块中的代码有可能抛出异常 catch (MyExceptionType e) / 处理try代码块中抛出的MyExceptionType类型的异常实例e finally /无论是否有异常抛出,此部分代码总是被最后执行 ,2处理运行环境抛出的异常,public class NullPointerExceptionDemo public static void main(String args) String str=null; int length=0; try length=str.length(); /空值调用方法 System.out.println(length); catch(NullPointerException e) System.out.println(“Exception occured : “+e); System.out.println(“Completed!“); ,3处理调用方法抛出的异常,public class HandleMthodException public static void main(String args) try File tmp=File.createTempFile(“abc“,“log“); System.out.println(tmp.getAbsolutePath(); catch (IOException e) System.out.println(e.getMessage(); 注:如果一个方法声明会抛出非运行时异常类的子类,则调用该方法时,必须用捕获机制,4.多异常情况下的catch,当try代码块中可能会抛出1到多个异常,如何处理这可能的多个异常呢? 非常简单,就是,按照异常的包容性(子类在前,父类在后),把需要捕获后处理的异常对应的catch逐次排列即可。,多异常示例,public class NullPointerExceptionDemo public static void main(String args) String str=null; int length=0; try length=str.length(); System.out.println(length); catch(NullPointerException e) System.out.println(“Exception occured : “+e); catch(ArithmeticException e) System.out.println(“Exception occured : “+e); catch(Exception e) System.out.println(“Exception occured : “+e); ,5. finally语句,finally语句在try/catch/finally是一个可选的部分。finally语句定义一个总是执行的代码块,而不考虑异常是否被捕获。所以它提供了在try/catch代码块执行结束后的后处理机制。下面一个用户登录验证的模拟过程: try 查找用户; 匹配密码 catch(AccountNotFoundException e) 处理没有发现账号的异常; catch(PasswordMismatchException e) 处理账号密码不匹配的异常; finally 登记本次访问; ,示例程序 注意:一个try块可以不执行finally子句就能够退出的唯一方法是通过调用System.exit()方法来实现的。,6 捕获所有异常,catch(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. 控制转移,直接返回,吃掉了异常 ,7.丢失的异常,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 ,课堂练习,补充下面的程序 class Excep static void method() throws Exception throw new EOFException(); public static void main(String args) try method(); catch( ) ,四.自定义异常,用户定义异常是通过扩展Exception类或子类来创建的一种具有特殊用途的子类,这种异常类可以包含一个“普通”类所包含的任何东西。,一个自定义的异常类,public class AccountNotFoundException extends Exception String account; public AccountNotFoundException() super(“This account has not found.“); public AccountNotFoundException(String account) super(“This account about “ +account+ “has not found.“); this.account=account; public void getAccount() return this.account; ,五.方法声明中的异常列表,1.方法声明中的异常 type methodName(type para1,) throws Exception1,Exception2 如: public void login(String account,String password) throws AccountNotFoundException ,public void login(String account,String password) throws AccountNotFoundException, PasswordMismatchException 注: 一个方法可以抛出多个异常,异常之间用逗号隔开。 一个方法在某个时刻只能抛出一个异常。,2. 在程序中编码抛出异常实例,public class AccountNotFoundException extends Exception String account; /保存用户输入的帐号名 public AccountNotFoundException() super(“This account has not found.“); public AccountNotFoundException(String account) super(“This account about “ +account+ “has not found.“); this.account=account; ,public class User public void login(String account, String password) throws AccountNotFoundException, PasswordMismatchException boolean accountExisted = false; / 默认帐号不存在 String otherPassword; / 此处可插入查询帐号的代码 if (accountExisted) / 如果帐号不存在,抛出异常,程序中断 throw new AccountNotFoundException(account); public 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.将程序正常执行中可能发生的例外定义为异常,如登陆中的账号不存在、密码不匹配等。 2.对捕获到的异常要有针对性处理,如错误恢复机制。不要捕获到异常,却没有任何实质意义的处理,异常并不是调试。 3.分析可能出现异常的代码,不要将无关的代码放入try代码块中,求得心理安慰而使得try代码块变得过于庞大,这样做可能导致出现异常而无法确定异常的位置,因为有可能多个地方发出同样的异常。 4.在一个代码块中,try/catch/finally即可以嵌套也可以出现并行情况。 5.尽量不要使用Exception试图捕获所有的异常,要注意不同的异常要有针对性处理,不要把所有的异常放在一起处理。 e.尽量利用异常而不是返回值来揭示程序执行中的状态,也不能用异常来代替简单的测试和逻辑判断。,小结,1 异常 什么是异常?异常就是标识程序中出现的错误。 异常都是Throwable的子类对象。 三类异常的区别 Error类及其子类错误无法处理。 RuntimeException类及其子类异常可以不用处理,也可选择性处理。 其它类型的异常必须得到处理。,2 异常捕获处理 将可能发生异常的语句放在try代码块中,来确保异常发生时能够得到捕获。 catch语句块对捕获到的异常进行处理,也可继续抛出,交由调用者处理。 fin

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论