版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第9章异常处理异常处理 w 9.1.1生活中的异常生活中的异常w 异常(Exception)不仅仅出现在程序中,生活中倒霉的事情经常会发生,这就是人们生活中遇到的“异常”。w 例如,极限滑板运动在比赛的时候会做出各种高难度的动作,滑板运动员如果万一受伤,会有人上来给他包扎,或者送他上医院。他的滑板动作暂时停止,这就是处理异常的过程。w 生活中的异常多种多样,时刻都有可能发生,无从预测。但是,生活中遇到异常之后,往往都延续着下一个工作:那就是处理异常。w 软件中的异常和生活中异常的出现机制、处理方法具有很大的类似之处。接下来我们来看软件中的异常。9.1 认识异常认识异常w 9.1.2 软件中的异
2、常软件中的异常w 以最简单的例子为例:编写一个程序,能够让用户输入一个圆的半径,然后打印这个圆的面积。w 用现有的知识,非常简单就可以编出代码如下:9.1 认识异常认识异常w 9.1.2 软件中的异常软件中的异常w 以上程序能够打印正确的结果,但是软件的风浪就是运行中的不确定因素。该软件遇到一个不熟练的操作员,她输入了如下内容(也许她无法区别键盘上0和o)。点击“确定”,程序打印:9.1 认识异常认识异常w 9.1.3为什么要处理异常为什么要处理异常w 上一节的程序,在输入不正确格式的内容时,实际上是发生了异常。w 异常的出现,是在程序编译通过的情况下,程序运行过程中出现一些突发情况造成的。如
3、果任由异常出现不去管它,会给软件带来什么样的问题呢?w 很显然,首先是没有给用户一个较为友好的界面,比如用户不小心将“10”输成了“1o”,至少正确的软件应该提示用户“格式输错了”,让他重新输入。否则用户看到一堆乱糟糟的东西,你要他怎么处理?w 另一个读者可能还没有意识到的问题是:异常不处理,会给程序带来安全隐患。9.1 认识异常认识异常w 9.1.4 异常机理异常机理w 要处理异常,必须首先弄清异常的机理。w 异常是以什么机理出现的呢?让我们再来看看前面异常出现的“症状”,该图中的内容可以标示如下:9.1 认识异常认识异常从中可以看出:1. 异常类型为:java.lang.NumberFor
4、matException。可以查看文档,找到该类,在文档中非常详细地说明了该异常出现的原因:w 9.1.5 常见异常常见异常w 异常类一般都是Exception的子类,类名以Exception结尾。如果碰到,去文档中找其原因。以下总结了一些常见的异常及其发生的原因:w 1. ArithmeticException: 算术异常,如除数为0。w 2. ArrayIndexOutOfBoundsException:数组越界异常。w 3. ArrayStoreException:数组存储异常。w 4. ClassCastException:类型转换异常。w 5. IllegalArgumentExce
5、ption:无效参数异常。w 6. NegativeArraySizeException:数组尺寸为负异常。w 7. NullPointerException:未分配内存异常。w 8. NumberFormatException:数字格式异常。w 9. StringIndexOutOfBoundsException:字符串越界异常。9.1 认识异常认识异常9.2 异常的就地捕获异常的就地捕获w 9.2.1 为什么要就地捕获为什么要就地捕获w 滑板运动员如果受伤,对他救助的方法有两种:现场救助和送医院让医生救助。w 其中,现场救助就类似于“就地捕获”,也可以理解为:“在模块内部解决”。 w 很简
6、单,当程序出现异常时,让程序跳转到一段处理程序就行了;就好像滑板运动员受伤时,我们马上启动救助措施。不过,如果他没有受伤,救助准备也得做,但是措施就不用采取了。w 同样,在编程时,我们也得事先准备一段代码,当程序发生异常时,执行那段处理异常的代码,如果没有异常,那段代码也得备用在那边。w 这就是异常的就地捕获(catch):当程序发生异常时,系统捕获异常,转而执行异常处理代码。9.2 异常的就地捕获异常的就地捕获w 9.2.2 如何就地捕获异常如何就地捕获异常w 怎么进行就地捕获呢?过程如下:w 第1步:用try块将可能出现异常的代码包起来。w 第2步:用catch块来捕获异常并处理异常。w
7、第3步:如果有一些代码是不管异常是否出现都要运行的,用finally块将其包起来。w 9.2.2 如何就地捕获异常如何就地捕获异常w 格式如下:w tryw/*可能出现异常的代码*/w w catch(Exception1 ex1)w /*处理异常*/w w finallyw /*不管异常是否出现都要运行的代码*/w 9.2 异常的就地捕获异常的就地捕获w 9.2.3 如何捕获多种异常如何捕获多种异常w 代码中可能出现的异常可能会有很多种类。如Java中常见的就有:未分配内存异常、未找到文件异常等等。怎样尽可能地捕获程序中可能出现的异常呢?w 我们可以利用try后面接多个catch。每个cat
8、ch用于捕获某种异常。当try中出现异常,程序将在catch中寻找是否有相应的异常处理代码,如果有,就处理。所以如果你想让代码处理所有可能预见的异常,可以用如下方法: 9.2 异常的就地捕获异常的就地捕获w 9.2.4 用用finally保证安全性保证安全性w 在异常处理过程中,finally块是可选的,实际上,finally是为了更大程度上保证程序的安全性。finally块中的代码,不管前面是否发生异常,代码都会执行。w finally最大的特点就是:在try块内即使跳出了代码块,甚至跳出函数, finally内的代码仍然能够运行。w 为了讲解这个问题,观察如下程序: 9.2 异常的就地捕获
9、异常的就地捕获该代码在try块内包含了一个return语句。运行,界面上打印:w 9.2.4 用用finally保证安全性保证安全性w 而如果改为:w 则打印:w “关闭文件”将不会打印,这说明finally在保证系统的可靠性方面,并不是可有可无的。所以,为了系统的安全考虑,必须充分利用finally的优势。 9.2 异常的就地捕获异常的就地捕获w 9.3.1 为什么要向外抛出为什么要向外抛出w 滑板运动员受伤之后,出了就地救治之外,还可以送往医院,让另一个机构:医院来救治。w 同样,复杂的软件可能由很多模块构成,模块之间存在着复杂的调用关系,当某个模块发生异常时,可以不在模块内处理异常,而将
10、异常抛给这个模块的调用方。 9.3 异常的向前抛出异常的向前抛出w 9.3.2 如何向外抛出如何向外抛出w 方法如下:w 1. 将需要向将需要向外外抛出异常的函数抛出异常的函数后后加上一个加上一个异常异常标记:标记:throws XXXException,表示可能向,表示可能向外外抛出某种异常。抛出某种异常。如:w public void fun() throws NullPointerException w /该函数如出现NullPointerException,则向外抛出w w 如果考虑抛出多种异常,各种异常用逗号隔开;如:w public void fun() throws NullPo
11、interException, NumberFormatException w /该函数如出现NullPointerException或NumberFormatException,则向前抛出 9.3 异常的向外抛出异常的向外抛出w 9.3.2 如何向外抛出如何向外抛出w 如果抛出所有类型的异常,就直接写:throws Exception。如:w public void fun() throws Exception w /该函数如出现异常,则向外抛出w w 2. 客户端可以就地处理,也可以继续抛出。客户端可以就地处理,也可以继续抛出。w 其中,就地处理的代码框架如下: 9.3 异常的向外抛出异常
12、的向外抛出w 9.4.1 为什么需要自定义异常为什么需要自定义异常w 异常的处理可以让我们的软件界面更加友好,并且更加安全。但是,异常的作用远不仅于此。w 以前面的计算器为例,如果操作员输入错误的格式,如“1o”、“dsf”等,用前面学会的异常处理技术,可以让系统界面更加友好。w 但是,客户对软件提出了另一个需求:公司为了减少错误输入的次数,要对每个员工进行考核,不仅要保存异常消息,还需要保存异常发生的时间,如何实现呢?w 实际上,用传统方法实现也是可以的,但是从专业角度,我们更加希望异常消息和异常时间可以封装在一个新的异常对象里面。如果那样,就相当于给予异常更加丰富的功能,如果以后用户又要在
13、异常出现的时候保存其他内容,就直接封装在异常内部。w 自定义异常可以帮我们实现这个功能。 9.4 自定义异常自定义异常w 9.4.2 如何自定义异常如何自定义异常w 自定义异常及其使用方法如下:w 1. 建立一个自定义异常类,继承建立一个自定义异常类,继承Exception,在里面封装需要封装的,在里面封装需要封装的信息。信息。w 如上面的例子中,可以建立InputException类;代码如下: 9.4 自定义异常自定义异常w 9.4.2 如何自定义异常如何自定义异常w 2在可能发生异常的函数后面添加在可能发生异常的函数后面添加throws XXXException。w 如calcArea函数就可以改为:w public static void calcArea() throws InputExceptionw / w 3:在可能抛
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年上海师范大学单招职业适应性测试题库带答案详解(典型题)
- 2026年上饶幼儿师范高等专科学校单招职业适应性考试题库附参考答案详解(预热题)
- 2026年云南省玉溪市单招职业适应性考试题库及一套完整答案详解
- 2026年临汾职业技术学院单招职业倾向性测试题库附答案详解(a卷)
- 2026年三亚航空旅游职业学院单招职业倾向性测试题库及参考答案详解
- 2026年云南旅游职业学院单招职业适应性测试题库附参考答案详解(满分必刷)
- 2026年三亚中瑞酒店管理职业学院单招职业适应性考试题库完整答案详解
- 2026年三亚中瑞酒店管理职业学院单招职业适应性考试题库含答案详解(培优b卷)
- 2025年理科专插本试题及答案
- 职业技能鉴定档案管理制度
- 2026年高考地理压轴训练卷2
- 宠物领养协议书范文合集
- 护理儿科中医题库及答案解析
- 机械行业高效电机节能改造方案
- 2025年事业单位笔试-云南-云南卫生公共基础(医疗招聘)历年参考题库含答案解析
- 2025年重庆市中考道德与法治真题(原卷版)
- 赵露思粉丝测试题及答案
- 湖南省2025年高考公安院校公安专业招生政治考察表
- 五年级上册数学每日一练(15天)寒假作业
- 山东省东营市垦利区(五四制)2024-2025学年六年级上学期期末考试地理试题
- 龋病的病因及发病过程(牙体牙髓病学课件)
评论
0/150
提交评论