版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、JAVA异常异常分类JAVA异常可分为可检测异常,非检测异常和自定义异常。可检测异常可检测异常经编译器验证,对于声明抛出异常的任何方法,编译器将强制执行处理或声明规则,例如SQLException就是一个检测异常,你连接JDBC时,不捕捉这个异常,编译器就通不过。非检测异常非检测异常不遵循处理或声明规则。在产生此类异常时,不一定非要采取任何适当操作,编译器不会检查是否已解决了这样一个异常。例如:一个数组长度为3,当使用下标时,就会产生数组下标越界异常,JVM不会检测这个异常,要靠程序员来判断。 有两个主要类定义非检测异常:RuntimeException和Error。Error属于非检测异常,
2、因为无法预知它们的产生时间。若JAVA应用程序内存不足,则随时可能出现OutOfMemoryError,起因一般不是应用程序的特殊调用,而是JVM自身的问题。另外,Error一般表示应用程序无法解决的严重问题。RuntimeException类也属于非检测异常,因为普通JVM操作引发的运行时异常随时可能发生,此类异常一般是由特定操作引发。但这些操作在JAVA应用程序中会频繁出现。因此,它们不受编译器检查与处理或声明规则的限制。自定义异常自定义异常是为了表示应用程序的一些错误类型,为代码可能发生的一个或多个问题提供新含义。可以显示代码多个位置之间的错误的相似性,也可以区分代码运行时可能出现的相似
3、问题的一个或者多个错误,或给出应用程序中一组错误的特定含义。例如,对队列进行操作时,有可能出现两种情况:空队列时试图删除一个元素;满队列时试图添加一个元素。则需要自定义两个异常来处理这两种情况。处理异常:try-catch-finally1、 只要进入了try-catch-finally结构,finally语句块“无论如何”都会执行,即使try/catch块内有return语句;2、 finally语句的执行时机是try-catch-finally结构退出前,例如,在try/catch块内遇到return语句或throw语句,则在执行该return或throw语句前先执行finally块。3、
4、 在try-catch-finally结构“后”的代码会在finally块执行完后执行,但如果在try/catch块内遇到return语句或throw语句,try-catch-finally结构后的代码不会被执行。4、 如果在try-catch-finally结构“前”遇到了return语句,则整个try-catch-finally结构都不会被执行。看下面测试程序的运行情况 public class ExceptionTestpublic static void main(String args) ExceptionTest obj = new ExceptionTest();obj.func
5、();System.out.println("主程序正常结束。");public void func() String valueStr = "100.23"try double value = Double.valueOf(valueStr);System.out.println("value = " + value);catch (NumberFormatException e) System.out.println("发生了数据格式异常!");finally System.out.println("
6、执行了finally语句!");System.out.println("函数结束。");程序运行后输出:value = 100.23执行了finally语句!函数结束。主程序正常结束。这说明:当try-catch-finally结构没有捕获到异常时,程序执行完try块的代码后执行finally块的代码,然后执行finally块后面的代码。如果将程序中的String valueStr = "100.23"改成String valueStr = "100.xx"再运行程序,输出如下:发生了数据格式异常!执行了finally语句!
7、函数结束。主程序正常结束。这说明:当try-catch-finally结构的try块的代码捕获到异常时,try块其后的代码不被执行,而是跳到相应的catch块,catch块执行完后执行finally块,最后还要执行try-catch-finally结构后面的代码。如果在try块增加一条return语句,如下:public class ExceptionTest public static void main(String args)ExceptionTest obj = new ExceptionTest();obj.func();System.out.println("主程序正常结
8、束。");public void func()String valueStr = "100.23"try double value = Double.valueOf(valueStr);System.out.println("value = " + value);return; /增加一条return语句catch (NumberFormatException e) System.out.println("发生了数据格式异常!");finally System.out.println("执行了finally语句!&
9、quot;);System.out.println("函数结束。"); 输出将变成: value = 100.23 执行了finally语句!主程序正常结束。如果在catch块内增加一条return语句,如下:public class ExceptionTest public static void main(String args) ExceptionTest obj = new ExceptionTest(); obj.func(); System.out.println("主程序正常结束。"); public void func() String
10、valueStr = "100.XX" try double value = Double.valueOf(valueStr); System.out.println("value = " + value); catch (NumberFormatException e) System.out.println("发生了数据格式异常!"); return; /增加一条return语句 finally System.out.println("执行了finally语句!"); System.out.println(&qu
11、ot;函数结束。"); 输出将变成: 发生了数据格式异常!执行了finally语句!主程序正常结束。以上两例说明:当在try-catch-finally结构的try/catch块内遇到return语句,则在执行到try/catch块内的return语句时,先执行finally块的代码,完后再执行return语句,不再执行finally块后面的代码。如果将程序在try结构内throw出异常,如下:public class ExceptionTest public static void main(String args)ExceptionTest obj = new Exception
12、Test();try obj.func(); catch (Exception e) System.out.println("主程序捕获到异常!"); System.out.println("主程序正常结束。");public void func() throws ExceptionString valueStr = "100.23"try if( valueStr.equals("100.23") ) throw new Exception("人为错误"); double value = Do
13、uble.valueOf(valueStr);System.out.println("value = " + value);catch (NumberFormatException e) System.out.println("发生了数据格式异常!"); finally System.out.println("执行了finally语句!"); System.out.println("函数结束。");运行程序输出如下信息:执行了finally语句!主程序捕获到异常!主程序正常结束。如果将程序在catch结构内thro
14、w出异常,如下:public class ExceptionTest public static void main(String args)ExceptionTest obj = new ExceptionTest();try obj.func(); catch (Exception e) System.out.println("主程序捕获到异常!"); System.out.println("主程序正常结束。");public void func() throws ExceptionString valueStr = "100.XX&quo
15、t;try double value = Double.valueOf(valueStr);System.out.println("value = " + value);catch (NumberFormatException e) System.out.println("发生了数据格式异常!");throw new Exception("人为错误");finally System.out.println("执行了finally语句!");System.out.println("函数结束。");
16、 运行程序输出如下信息:发生了数据格式异常!执行了finally语句!主程序捕获到异常!主程序正常结束。这说明:当try-catch-finally结构的try/catch块内throw出异常时,try/catch块内其后的代码不被执行,跳到finally块执行,完后抛出异常并结束该异常函数,并不会执行finally块后面的代码。声明异常:throws若要声明异常,则必须将其添加到方法签名块的结束位置。下面是一个实例: public void errorProneMethod(int input) throws java.io.IOException /Code for the method,
17、including one or more method/calls that may produce an IOException 这样,声明的异常将传给方法调用者,而且也通知了编译器:该方法的任何调用者必须遵守处理或声明规则。声明异常的规则如下: 必须声明方法可抛出的任何可检测异常(checked exception)。 非检测性异常(unchecked exception)不是必须的,可声明,也可不声明。 调用方法必须遵循任何可检测异常的处理和声明规则。若覆盖一个方法,则不能声明与覆盖方法不同的异常。声明的任何异常必须是被覆盖方法所声明异常的同类或子类。异常处理的原则和忌讳异常处理的原则
18、1. 尽可能的处理异常要尽可能的处理异常,如果条件确实不允许,无法在自己的代码中完成处理,才考虑声明异常。2. 具体问题具体解决异常的部分优点在于能为不同类型的问题提供不同的处理操作。有效异常处理的关键是识别特定故障场景,并开发解决此场景的特定相应行为。为了充分利用异常处理能力,需要为特定类型的问题构建特定的处理器块。3. 记录可能影响应用程序运行的异常至少要采取一些永久的方式,记录下可能影响应用程序操作的异常。理想情况下,当然是在第一时间解决引发异常的问题。不过,无论采用哪种处理操作,一般总应记录下潜在的关键问题。别看这个操作很简单,但它可以帮助您用很少的时间来跟踪应用程序中复杂问题的起因。
19、4. 根据情形将异常转化为业务上下文若要通知一个应用程序特有的问题,有必要将应用程序转换为不同形式。若用业务特定状态表示异常,则代码更易维护。从某种意义上讲,无论何时将异常传到不同上下文(即另一技术层),都应将异常转换为对新上下文有意义的形式。 异常处理的忌讳 1. 一般不要忽略异常在异常处理块中,一项最危险的举动是“不加通告”地处理异常。如下例所示: try Class.forName("business.domain.Customer"); catch (ClassNotFoundException exc) 经常能够在代码块中看到类似的代码块。有人总喜欢在编写代码时简
20、单快速地编写空处理器块,并自我安慰地宣称准备在“后期”添加恢复代码,但这个“后期”变成了“无期”。这种做法有什么坏处?如果异常对应用程序的其他部分确实没有任何负面影响,这未尝不可。但事实并非如此,异常会扰乱应用程序的状态,此时,这样的代码无异于掩耳盗铃。这种做法若影响较轻,则应用程序可能出现怪异行为。例如,应用程序设置的一个值不见了,或GUI失效。若问题严重,则应用程序可能会出现重大问题,因为异常未记录原始故障点,难以处理,如重复的NullPointerExceptions。 如果采取措施,记录了捕获的异常,则不可能遇到这个问题。实际上,即使确认异常对代码其余部分绝无影响,至少也要作记录。进一
21、步讲,永远不要忽略问题;否则,风险很大,在后期会引发难以预料的后果。2. 不要使用覆盖式异常处理块另一个危险的处理是覆盖式处理器(blanket handler)。该代码的基本结构如下: try / catch (Exception e) / 使用覆盖式异常处理块有两个前提之一:1) 代码中只有一类问题。 这可能正确,但即便如此,也不应使用覆盖式异常处理,捕获更具体的异常形式有利无弊。2) 单个恢复操作始终适用。 这几乎绝对错误。几乎没有哪个方法能放之四海而皆准,能应对出现的任何问题。 分析下这样编写代码将发生的情况。只要方法不断抛出预期的异常集,则一切正常。但是,如果抛出了未预料到的异常,则
22、无法看到要采取的操作。当覆盖式处理器对新异常类执行千篇一律的任务时,只能间接看到异常的处理结果。如果代码没有打印或记录语句,则根本看不到结果。更糟糕的是,当代码发生变化时,覆盖式处理器将继续作用于所有新异常类型,并以相同方式处理所有类型。3. 一般不要把特定的异常转化为更通用的异常将特定的异常转换为更通用异常是一种错误做法。一般而言,这将取消异常起初抛出时产生的上下文,在将异常传到系统的其他位置时,将更难处理。见下例: try/ Error-prone code catch(IOException e)String msg = "If you didnt have a problem
23、 before, you do now!" throw new Exception(msg);因为没有原始异常的信息,所以处理器块无法确定问题的起因,也不知道如何更正问题。4. 不要处理能够避免的异常对于有些异常类型,实际上根本不必处理。通常运行时异常属于此类范畴。在处理空指针或者数据索引等问题时,不必求助于异常处理。JAVA异常处理的应用实例在定义银行类时,若取钱数大于余额时需要做异常处理。定义一个异常类InsufficientFundsException。取钱(withdrawal)方法中可能产生异常,条件是余额小于取额。异常处理是在调用withdrawal的时候,因此withdrawal方法要声明抛出异常,由上一级方法调用。异常类:class InsufficientFundsException extends Exception private Bank excepbank; / 银行对象private double excepAmount; / 要取的钱InsufficientFundsException(Bank ba, double dAmount) excepbank = ba;excepAmount = dAmount;public String excepMessage() String str=&
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年吉林省金融控股集团股份有限公司人员招聘考试备考题库及详细答案解析
- 2026年广西建工集团有限责任公司人员招聘考试模拟试题及详细答案解析
- 2026年中石化销售西北分公司人员招聘考试题库及详细答案解析
- 2026年矿冶科技集团有限公司人员招聘笔试备考题库及详细答案解析
- 2026年青岛市政空间开发集团有限责任公司人员招聘笔试备考试题及详细答案解析
- 2026年联通智网创新中心人员招聘考试备考题库及详细答案解析
- 2026年合肥城建发展股份有限公司人员招聘考试题库及详细答案解析
- 2026年华融国际信托有限责任公司人员招聘笔试备考题库及详细答案解析
- 2026年玻璃纤维和玻璃纤维增强塑料制品制造行业发展研究报告及未来五至十年资本热度与投融资趋势
- 2026年毛皮衣着附件行业洞察报告及未来五至十年发展趋势报告
- 2026-2030中国咖啡生豆行业竞争格局及消费趋势预测报告
- AQ3035-2010危险化学品重大危险源安全监控技术规范关键条款解读
- T∕CHCIA 013-2023 液体香氛规范
- 2025版《广东省护理病历书写管理规范(试行)》
- 艾滋病病毒抗体快速检测技术手册(2026年版)
- 心理随访工作制度及流程
- (完整版)冬季施工专项施工方案
- 2024年全国职业院校技能大赛高职组(检验检疫技术赛项)考试题库(含答案)
- 银行对公营销培训课件
- 社区口腔健康促进的多学科协作策略
- 冬季安全生产综合注意事项(防冻、防滑、防火、防爆、防中毒)课件
评论
0/150
提交评论