ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:27.06KB ,
资源ID:18094455      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/18094455.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Java基础第7章异常处理Word格式文档下载.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Java基础第7章异常处理Word格式文档下载.docx

1、JAVA程序的执行过程中如果出现异常,就会有几件事随之发生。首先,自动生成一个异常类的对象,该对象包含了有关异常的基本信息,然后当前执行路径被终止,并且从当前环境中弹出异常对象的引用(其实这个异常对象的引用是被自动提交给JAVA运行时系统的),这个过程称为“抛出异常”。当JAVA运行时系统接收到异常对象时,会寻找能处理这一异常的代码,并把当前异常对象交给其处理,这个过程称为“异常捕获”。7.2 捕获异常首先让我们先看一个简单的示例。例7.1 :public class firstException public static void main(String args) int temp1 =

2、 20; int temp2 = 0; System.out.println(temp1/temp2); System.out.println(上面因为除数为零,所以应该对异常进行处理,否则本行将不能输出); 编译:javac firstException.java运行:java firstException这时程序就终止了,并抛出一个JAVA运行时捕获的异常,内容如下:Exception in thread main java.lang.ArithmeticException: / by zero at firstException.main(firstException.java:7)这段

3、提示的意思是:在main线程中产生了一个java.lang.ArithmeticException异常:原因是除数为0,错误代码在firstException.java这个文件的第7行。(线程的概念将在后面的章节进行讲解。)。下面我们对程序进行一下修改并保存,使之能够正常运行。例7.2 : try System.out.println(temp1/temp2); catch(ArithmeticException e) System.err.println(我是一个异常结果:我是一个异常上面因为除数为零,所以应该对异常进行处理,否则本行将不能输出虽然负数开平方绝对是不可以的,但是JAVA运行时

4、系统却不会捕获该异常,只是把开平方的结果赋予NaN值。这个NaN是“Not a Number”,即非数值(也有称其为“不确定式”的,但是非数值可能更合适一些)。但是比较有意思的是JAVA本身对NaN本身的定义,如下:publicstaticfinaldoubleNaN;因为对NaN的讨论已经超出本书的范围,所以在此不进行详细讨论,但是读者应该知道的是:即便两个NaN值也是不相等的。下面这个例子就能很好的说明这个问题:例7.3 :public class temp double a = -10; a = Math.sqrt(a); System.out.println(a); System.ou

5、t.println(a = a); double b = Double.NaN; System.out.println(b); System.out.println(b = b);javac temp.javajava temp NaN FalseNaN从firstException.java这个例子不难看出,异常捕获是在try块中进行的。try块中是可能产生异常的代码,这段代码在JAVA中称为监控区(guarded region)。而异常处理是在catch()中进行的。对于异常处理程序来说,一个try块对应着一个或多个catch()块,和一个在语法上可有可无的finally块。但是程序一旦包

6、含了finally块,则不管是否发生异常,finally块里的语句是一定要执行的。乍看上去有一点像现实中的“霸王条款”。但正是这个貌似“霸王条款”的finally块,它对于引入了“垃圾回收”机制的JAVA来说,有着极其特殊的价值。因为“垃圾回收”是由JVM控制的,我们不知道也不可能控制回收的时间。对于像已经使用完或无效的数据库连接这样占用系统大量宝贵资源的“垃圾”来说,必须要在第一时间将其释放。这时候JVM的“垃圾回收”机制的处理能力就显得有些苍白,在Web应用上更是如此。这时如果程序中加上了一个finally块,并且在里面加上一行释放连接的代码,问题就很简单的解决了。下面的这个小程序能有助于

7、读者对异常处理的理解。程序功能描述:定义一个可以实现统计前N名学生的平均成绩的方法。要求方法能接受学生成绩表和计算平均成绩的学生个数这两个参数。其中成绩表为整型数组,学生人数为普通的整型变量,实现如下:例7.4 :public class exampleException int grades = new int95,80,65,78,58; /计算前10名学生的成绩。 countAverage(grades,10); public static double countAverage(int grades,int total) int sum = 0; double ave = 0.0; b

8、oolean judge = false; for(int i = 0;i total;i+) sum += gradesi; ave = (double)sum/total; /其他的处理代码total为零,不能计算 judge = true; catch(ArrayIndexOutOfBoundsException e)统计的学生个数超出成绩表中的学生总人数 finally不管程序是否有异常,我都将会输出 if(judge = true) System.err.println(因为参数有误,将返回0.0 return 0.0; else return ave; 保存为exampleExce

9、ption.javajavac exampleException.javajava exampleException程序结果为: 统计的学生个数超出成绩表中的学生总人数不管程序是否有异常,我都将会输出因为参数有误,将返回0.0读者可以试着把return语句放到try块中或者catch()块中,然后把finally块中的关于返回值的语句去掉。看看程序能否通过编译并且正常运行。7.3 创建自定义异常房地产开发商根据市场部调查来的结果,最终抽象出适合某一类型用户群的商品房模型。经过施工使模型成为现房。而有该类型需求的用户,在购买完商品房后,不可避免的要对其进行装修:该掏壁橱的地方掏壁橱、该铺地毯的地

10、方铺地毯,最终设计出一套适合自己的住房。这样做的原因很简单。从开发商的角度来讲:他只能根据用户群的需求,建一个比较符合用户要求的“筒子楼”。而不可能为每一个用户量身定做住房(当然如果付得起费用的话,这也有可能)。这其中最主要的原因是:开发商在时间上耗不起。从用户的角度来讲:一屋子的水泥墙,连个床都没有。所以装修也就避不可少了。与现实中的房地产开发商比起来,SUN为JAVA异常这群“用户”定制的“JDK筒子楼”要高明得多:里面有“床”、有“空调”、有“有电视”。但是不管怎样,它依然是“筒子楼”,所以就不可避免的满足不了我们所有的要求。另外有些功能也不是我们所希望的那样。基于这点,创建自定义异常就

11、势在必行。但是读者需要知道的是:我们是在为“JDK筒子楼”装修,而非重建。所以我们要“extends Exception”。另外,在为“JDK筒子楼”装修前,还是看看都提供了那些主要功能吧。Java.lang软件包中的异常Exception ClassNotFoundException ClassNotSupportedException IllegalAccessException InstantiationException InterruptedException NoSuchMethodException RuntimeException ArithmeticException Arr

12、ayStoreException IllegalArgumentException IllegalThreadStateException NumberFormatException IllegalMonitorStateException IndexOutOfBoundsException ArrayIndexOutOfBoundsException String IndexOutOfBoundsException NegativeArraySizeException NullpointerException SecurityException上面所列出的java.lang包中提供的这些异常

13、基本能够满足初学者的使用需求。其余包中的异常请参照相关资料。如果书中的示例程序需要用到其它包中的异常,将给出特别的说明和解释。另外读者需要知道的是:异常的类库也在不断的扩大中,而且在第三方的异常库中依然可能存在其他的异常。在使用的时候如果出现了奇怪的异常,则应该特别注意了。Java的JDK中所提供的异常类数以百计。程序员不可能也没有必要将它们全部记住,用的时候可以去查手册,里面有非常详细的信息。而如果仅仅是要找到一个合适的异常类却有一个很简单也很巧妙的办法:把可能产生该类异常的代码放到一个main()方法中,并且把代码设置成一定会抛出异常的状态。这样我们就能在运行该段代码时,看到系统给出的提示

14、。下面给出一个小例子将有助于对上面叙述的理解:例7.5 :public class demo int temp1 = 3; /除数为零,所以肯定会出现异常。保存为:demo.javajavac demo.javajava demo Exception in thread at demo.main(demo.java:这样我们就找到了除数为零是属于哪个异常了。而这种方法对于不知道异常属于什么类型的情况则更为有用。在创建用户自定义异常之前,有必要简单了解一下Exception类的原型。Exception类有两个构造器:public Exception();public Exception(Stri

15、ng msg);下面将创建并使用一个自定义异常类。这也是在exampleException类基础上进行改写的。/创建自定义异常类:例7.6 :public class myException extends Exception public myException() public myException(String message) super(message);/重写父类的getMessage()方法 public String getMessage() return super.getMessage() + countAverage(int grades,int total);例7.7

16、 :class firstException public static double countAverage(int grades,int total)throws myException if(total grades.length) throw new myException(人数不能大于成绩表中的总人数 else return (double)sum/total;例7.8 :class test firstException.countAverage(grades,10); catch(myException e) System.out.println(n下面将调用自定义异常重写的g

17、etMessage()方法,来输出异常的内容 System.err.println(e.getMessage();n下面调用系统为父类定义的printStackTrace()来输出相关信息 e.printStackTrace(); e.getLocalizedMessage();myException.javajavac myException.javajava test下面将调用自定义异常重写的getMessage()方法,来输出异常的内容人数不能大于成绩表中的总人数countAverage(int grades,int total)下面调用系统为父类定义的printStackTrace()

18、来输出相关信息myException: 人数不能大于成绩表中的总人数countAverage(int grades,int total) at firstException.countAverage(myException.java:29) at test.main(myException.java:49)从上面的例子不难看出,要创建自定义的异常类,其实很简单。它与普通类的创建方法一样。只不过自定义的异常类必须继承Exception或Exception的子类(虽然建议要继承的父类,越接近该类型的异常越好。但是在实际编写代码的时候,却往往是继承Exception。原因就是:从Exception继

19、承而来的自定义异常类,绝大多数情况都能满足程序员的需要。而如果真的能找到这个接近该类型的异常类,往往就没有必要去编写自定义的异常类了)。例7.9 : 这样我们就得出了一个创建自定义异常类的模型:/*因为自定义异常往往是单独放在一个包中,为了能够被不同的包所引用,最好定义为public类型*/ public class userExceptionName extends Exception /构造器 public userExceptionName();public userExceptionName(Sgring msg) super(msg);/重写getMessage()方法public

20、String getMessage() /自定义的代码/也可以自定义一些自己特殊的方法这里要说明一下:因为我们不能保证我们“装修好了的筒子楼”没有别人住,所这两个构造器最好全都定义出来。当然还可以根据需要,再重载几个构造器以供使用。另外getMessage()方法不一定要进行重载。如果我们需要更详细的信息,可以调用Throwable类(它是Exception类的父类)的public void printStackTrace()方法。其实public void printStackTrace()方法还有两个重栽版本,分别是:public void printStackTrace(PrintStr

21、eam)public void printStackTrace(java.io.PrintWriter)关于这个方法更详细的说明请参照其他资料。在这里就不赘述了。创建完自定义异常类后,接下来就是如何来使用它。很显然“JDK筒子楼”不可能预料到我们会如此“装修”它,也就不可能预先抛出该类型的异常。所以在使用自定义异常前,还应知道知道该如何抛出自定义异常。访问修饰限制符 static 返回类型 方法名(参数) throws useExceptionName /自定义的代码 if() throw useExceptionName(可能的原因) ;其中throws为异常声明。有点类似于C语言中的函数声

22、明,目的就是告诉机器:我可能会抛出这样的异常,而且不管我是否抛出这类异常你都应该对这(些)类型的异常进行检测。当然,既然说是“可能会”,那么也就“可能不会”的情况发生,甚至真的在方法的实现中不抛出这类异常(但是调用该方法的时候必须对声明的抛出异常进行捕获。否则将不能通过编译)。这样做的好处有两个。第一个是:这样做能够使调用者知道使用该方法可能会面临什么样的问题,进而进行补救;第二个好处是:如果我们定义的是抽象类或接口时声明了要抛出的异常,那么派生类或接口的实现就能够抛出这些预先声明的异常了(这些被声明的异常类必须是已经定义好的,否则程序是不能通过编译的)。但是作为初学者需要知道的是:我们不可能

23、预见所有的异常,所以设计出了糟糕的异常声明也不要气馁。因为“任何进步都是需要代价的”,只要有勇气去做、去尝试就够了。或许读者会问“自定义异常真的这么简单吗”。答案是肯定的。而且JDK中所定义的异常类,有些甚至会更简单些。这并不是那些JAVA开发者的知识不够渊博,而是因为设计异常类所追求的目标就是尽可能简练地返回错误信息,以帮助程序员更好地调试程序。所以试图设计功能强大且十分华丽的自定义异常类的做法是非常不可取的。那样做不但违背了提出异常概念的初衷,而且使代码变得更加晦涩难懂。7.4 异常的尴尬或许这个标题有点难以理解。这么优秀的概念也有尴尬吗?回答是肯定的,而且异常的尴尬程度与程序员对异常功能

24、的期盼是成正比的。因为异常处理并不是万能的,它仅仅是保障程序正常运行的最后屏障。要想构建健壮灵活的代码,异常的确是必不可少的。但是最主要的确是在编码前期进行的“需求分析”、“需求定义”、“功能模块的划分”,因为这些才是构建健壮代码的基石。试想一下:地基已经倾斜的“比萨城斜塔”,即便在当今科技的鼎力支持下进行的补救措施,依然不能阻止它继续倾斜。那么,我们还敢期盼异常处理的补救工作真的能够“起死回生”吗?作为语言的一个功能模块,异常依然有着自己缺点和不足。下面将对此进行详细的说明,并给出相应的解决办法。运行一些大型软件的时候,偶尔会出现文件丢失的现象。而异常也同样面临着丢失的危险。前者的发生频率是“sometimes”,而后者如果程序员不加注意的话却是“often”甚至是“always”。异常丢失有些可能是语言本身的问题,但大多数是人为造成的。看一看下面的例子:例7.10 :class lostExceptio

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1