JAVA异常.ppt_第1页
JAVA异常.ppt_第2页
免费预览已结束,剩余36页可下载查看

下载本文档

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

文档简介

异常处理 目标 简介异常处理 throw、throws 异常的继承架构 总结 一个程序的编写的过程中,避免程序执 行时的错误,往往占了程序开发时程的 绝大多数时间,对于避免程序执行时的 错误,java 提供了异常处理机制。 在还没有学习异常处理之前,如果您要编写一 个除法程序,并由使用者输入除数与被除数, 由于被除数除以0没有意义,所以之前可能必 须像以下这样避免错误: if(b != 0) system.out.println(a / b); else system.out.println(“除数不能为0“); 这样的方式过去在一些程序语言中会很 常被利用,利用判断条件来避免错误的 发生,然而这样的方式会让错误处理与 程序的处理逻辑混在一起,使得程序难 以阅读,而 由于使用了一些判断条件, 即使有一些很少发生的错误,也都必须 一视同仁的进行判断检查,这会使得程 序的执行效能受到一定程度的影响。 java的异常处理机制可以协助我们捕捉程 序执行时期的错误,它用来处理一些系 统可以恢复的错误,异常(exception) 是java中定义的一种对象数据型态,在特 定错误发生时会丢出异常对象,我们可 以捕捉这些异常并加以处理,避免程序 可能的错误发生。 java的异常处理藉由“try“、“catch“、“finally“三个关 键词组合的语言来达到,其语法基本结构如下: try / 陈述句 catch(异常类型 名称) / 异常处理 finally / 一定会处理的区块 一个“try”所包括的区块,必须有对应的 “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(“请输入整数: “); 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异常 ,这个异常您必须处理。 您试着从使用者输入取得一个整数值,由 bufferedreader对象所读取到的输入是个字符 串,您使用integer类别的 parseint()方法试着剖 析该字符串为整数,如果无法解析,则会发生 错误并丢出一个numberformatexception异常 对象,当这个异常丢出后,程序会离开目前执 行的位置,而如果设定的“catch”有捕捉这个异 常,则会执行对应区块中的陈述句,注意当异 常一但抛出,就不会再回到异常的抛出点了。 如果程序中设定有“finally”区块,则无论 异常是否有发生,则一定会执行“finally” 区块中所定义的陈述句,“finally”区块使 用时机 的例子之一,就是当您开启了某 个文件时,在读/写的过程中发生错误, 在使用“catch”区块处理相对应的异常之 后,最后在“finally”区块中定义 一些关闭 文件的动作,让关闭文件的动作一定会 被执行。 使用异常处理的好处是您可以将程序逻 辑与错误处理分开,使得程序易于编写 、阅读与维护,由于异常处理是在程序 执行时发生错误,而没有办法处理之时 才产生异常对象,所以与使用判断式来 避免异常的方式比起来,异常处理会有 比较好的执行效能。 当程序发生错误而无法处理的时候,会抛出对 应的异常对象,除此之外,在某些时刻,您可 能会想要自行抛出异常,例如在异常处理结束 后,再将异常抛出,让下一层异常处理区块来 捕捉,若想要自行抛出异常,您可以使用 “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(“浮点数除以零: “ + (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(arrayindexoutofboundsexception 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“); 在这个程序中, arrayindexoutofboundsexception由内层 try-catch丢出并捕捉,由于内层 已经捕捉 了异常,所以外层的try-catch中之 arrayindexoutofboundsexception并不会 捕捉到内层所丢出的异常,但如果 内层 的try-catch并没有捕捉到这个异常,则外 层try-catch就有机会捕捉这个异常,例如 : public class usethrow public static void main(string args) try try throw new arrayindexoutofboundsexception(); catch(arithmeticexception 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),这些方法中可能会 因某些错误而引发异常,但您不希望直接在这个方法 中处理这些异常,而希望调用这个它的方法来统一处 理,这时候您可以使用“throws”关键词来声明这个方 法将会抛出异常,例如: private void arraymethod(int arr) throws arrayindexoutofboundsexception, arithmeticexception / 操作 注意如果会抛出多种可能的异常时,中 间使用逗点分隔;当有方法上使用 “throws”声明异常时,意味着调用该方法 的调用者必须处理这些异常,而被调用 方法可以保持程序逻辑的简洁,下面这 个范例是“throws“的一个简单示范: public class usethrows 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(); 简单的说,您要不就在方法中直接处理 异常,要不就在方法上声明该方法会抛 出异常,由调用它的调用者来处理异常 ,另一方面,在方法上使用 “throws”声 明可抛出的异常,也表示了您只能抛出 所声明类型的异常,其它的异常您必须 在方法中处理完,或是重新包装为所声 明的异常再抛出。 如果使用继承时,在父类别的某个方法上宣告了throws 某些异常,而在子类别中重新定义该方法时,您可以 : 不处理异常(重新定义时不设定throws) 可仅throws父类别中被重新定义的方法上之某些异常 可throws被重新定义的方法上之异常之子类别 但是您不可以: throws出额外的异常 throws被重新定义的方法上之异常之父类别 java的异常处理机制并不是只有将程序逻辑与异常处理 分开的好处,程序设计的错误情况很多且难以估计, 并没有人能保证自已所设计的程序完全无误,异常处 理最重要的是为程序设计人员提供种种可能的异常情 况,让程序设计人员能够掌握并设法排除。 java编译器会检查程序语法等的相关错误,这些错误 是属于编译时期错误,然而语法无误并不代表程 序逻辑没有错误,逻辑上的错误会在程序执行时发生 ,这是属于执行时期错误,而即使逻辑没有错误 ,也可能因为i/o、网络或甚至内存不足等情况而发生 错误。 java所处理的异常主要可分为两大类,一种是 严重的错误,例如硬件错误或内存不足等问题 ,与此相关的类别是位于java.lang下的error类 别;另一种是非严重的错误,代表可以处理的 状况,与此相关的是位于java.lang下的 exception类别。 error类别与exception类别都继承自throwable 类别,throwable类别拥有几个报告相关异常讯 息的方法: 除了使用这些方法之外,我们也可以利用 tostring()取得异常对象的错误描述。 getlocalizedmessage() 目前对象的描述 getmessage() 取得对象的错误讯息 printstacktrace() 取得堆栈中的讯息 您所处理的异常通常都是衍生自exception类别 ,其中大部份是执行时期异常( runtimeexception), 例如 arithmeticexception、 arrayindexoutofboundsexception等等,另外还 有一些非执行时期异常,例如 classnotfoundexception(尝试加载类别时失败 所引发,例如类别不存在)、 interruptedexception(执行绪非 执行中而尝试 中断所引发的异常)等等, 以下列出一些重要 的继承架构: throwable error(严重的系统错误) linkageerror threaddeath virtualmachineerror exception classnotfoundexception clonenotsupportedexception illegalaccessexception runtimeexception(执行时期异常) arithmeticexception arraystoreexception classcastexception 属于runtimeexception衍生出来的类别,是在 执行时期会发生的,不需要特别使用try-catch 或是在函数上使用“throws”宣告也 可以通过编 译,例如您在使用数组时,并不一定要处理 arrayindexoutofboundsexception异常。 exception下非runtimeexception衍生之异常如 果有引发的可能性,则您一定要在程序中明确 的指定处理才可以通过编译,例如当您使用 到 bufferedreader类别时,由于有可能引发 ioexception,您要不就在try-catch中处理,要 不就在函数上使用throws表 示由呼叫它的函数 来处理。 了解异常处理的继承架构是必须的,例 如在捕捉异常对象时,如果父类别异常 对象撰写在子类别异常对象之前被捕捉 ,则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(); 这个程序若在编译时将会产生以下的错 误信息: useexception.java:11: exception java.lang.arithmeticexception has already been caught catch(arithmeticexception e) 1 error 要完成这个程序的编译,您必须更改异常对象捕捉的 顺序,例如: import java.io.*; public class useexception public static void main(string args) try throw new arithmeticexception(“异常测试“); catch

温馨提示

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

评论

0/150

提交评论