`
wusuoya
  • 浏览: 630331 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

java异常的捕获与抛出原则

    博客分类:
  • Java
 
阅读更多

在 可能会出现exception的地方,要使用try-catch或者throws或者两者都要。我的判断依据是:如果对可能出现的exception不想 被外部(方法的调用者)知道,就在方法内部try-catch掉这个exception;如果希望外部知道,则在catch到之后把exception直 接抛出或者抛出自定义的exception。   
一、异常的种类   
 

Java中异常的分类

所有异常,都继承自java.lang.Throwable类。

Throwable有两个直接子类,Error类和Exception类。

Exception

Exception则可使从任何标准Java库的类方法,自己的方法以及运行时任何异常中抛出来的基类型。

异常可分为执行异常(RuntimeException)和检查异常(Checked Exceptions)两种

RuntimeException

RuntimeException在默认情况下会得到自动处理。所以通常用不着捕获RuntimeException,但在自己的封装里,也许仍然要选择抛出一部分RuntimeException

RuntimeException是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类。可能在执行方法期间抛出但未被捕获的RuntimeException的任何子类都无需throws子句中进行声明。(java api

它是uncheckedExcepiton

Java.lang.ArithmeticException

Java.lang.ArrayStoreExcetpion

Java.lang.ClassCastException

Java.lang.EnumConstantNotPresentException

Java.lang.IllegalArgumentException

       Java.lang.IllegalThreadStateException

       Java.lang.NumberFormatException

Java.lang.IllegalMonitorStateException

Java.lang.IllegalStateException

Java.lang.IndexOutOfBoundsException

       Java.lang.ArrayIndexOutOfBoundsException

       Java.lang.StringIndexOutOfBoundsException

Java.lang.NegativeArraySizeException’

Java.lang.NullPointerException

Java.lang.SecurityException

Java.lang.TypeNotPresentException

Java.lang.UnsupprotedOperationException

CheckedException

除了runtimeException以外的异常,都属于checkedException,它们都在java.lang库内部定义。Java编译器要求程序必须捕获或声明抛出这种异常。

一个方法必须通过throws语句在方法的声明部分说明它可能抛出但并未捕获的所有checkedException

Java.lang.ClassNotFoundException

Java.lang.CloneNotSupportedException

Java.lang.IllegalAccessException

Java.lang.InterruptedException

Java.lang.NoSuchFieldException

Java.lang.NoSuchMetodException

Error

当程序发生不可控这种错误时,通常的做法是通知用户并中止程序的执行。

与异常不同的是Error及其子类的对象不应被抛出。

Error Throwable 的子类,代表编译时间和系统错误,用于指示合理的应用程序不应该试图捕获的严重问题。大多数这样的错误都是异常条件。虽然 ThreadDeath 错误是一个正规的条件,但它也是 Error 的子类,因为大多数应用程序都不应该试图捕获它。

在执行该方法期间,无需在其 throws 子句中声明可能抛出但是未能捕获 Error 的任何子类,因为这些错误可能是再也不会发生的异常条件。

它是uncheckedExcepiton

 

还可参考链接:http://blog.csdn.net/ilibaba/article/details/3965359



二、主要原则   
处理意外的一个重要原则,就是要么处理,要么接着抛,决不能吃掉(You either handle it, or throw it. You don’t eat it.)这就是说,当你捕获一个异常之后,必须决定是否立即处理这个异常,或者继续抛出这个异常(或者另一个自定义异常),以便由调用的客户端捕获之。当客户端捕获到以后,又会继续进行类似的判断。 

一般来说,GUI端是要处理异常的,比如JSP捕获到异常之后,需要先是给用户一个友好的出错信息,而不要给出系统的出错信息。系统的出错信息一方面不太友好,另一方面提供了太多的系统信息,容易被恶意用户用来攻击系统。

换句话说,所有的异常最终必须有一个终极的处理者,这就是GUI。至于中间的环节,比如在服务器端运行的JavaBean是否要处理捕获到的异常,还是继续抛出所捕获的异常,需要视具体情况处理。   

除非你想把异常处理的责任交给调用者,一般不用throws。 比如你要读入一些文件,如果你想通知调用者,让调用者决定如何处理这个异常,你就把这个异常throws给调用者;如果你知道应该如何处理这个异常,或者你想把异常马上解决,你可以就地catch她。 

这完全取决于你想把异常自己立即处理还是想把处理责任返回给调用者。取决于你的程序的结构和要求。   
需要注意的有: 
1、如果无法处理某个异常,那就不要捕获它。   
2、如果捕获了一个异常,请不要胡乱处理它。   
3、尽量在靠近异常被抛出的地方捕获异常。   
4、在捕获异常的地方将它记录到日志中,除非您打算将它重新抛出。   
5、按照您的异常处理必须多精细来构造您的方法。   
6、需要用几种类型的异常就用几种,尤其是对于应用程序异常。   

三、异常嵌套和捕获适当的异常 

按照Java语言的定义,所谓异常(Exception)指的就是向调用方法(calling method)表示发生非正常情况的习惯方式。下面讨论两种在处理异常时可兹利用的技术:异常嵌套和捕获适当的异常。 

异常嵌套   
你在试图捕获异常并打算扔出异常时该采取什么措施呢?同时,你希望原始的异常信息可用吗?   

要回答以上的问题你不妨尝试一下NestedException类。具体的编程并不难,唯一要做的无非是利用构造器并且重载printStackTrace()以便显示出正确的数据。 

此外,你还应当考虑封装Throwable而非Exception类来创建更具有重用性的组件。之后,你可以创建NestedRuntimeException变量封装Throwable但无需对其进行声明。 

捕获适当的异常 
正确地处理异常并不是一项轻松的任务,这是因为异常的处理有时会导致程序出现其他不明行为。不过,以下三条规则可以帮助你避免错误处理异常所可能遭遇的风险。 

规则 #1: 总是捕获扔出异常的类型而不要理睬异常的超类。 为了遵守通常的代码习惯,你可以采用Exception类的大写字母作为变量名,如下所示:   
    catch(FileNotFoundException fnfe)   
以及 
    catch(SQLException sqle) 

规则 # 2: 决不让catch块留空。在很多情况下虽然确实编写了try/catch块但在代码的catch部分却什么都没有做。或者,如果采用了日志API(Logging API),那么请编写代码把异常写到日志中。 

规则 # 3: 决不扔出Exception基类的实例。开发人员应当总是扔出自己创建的异常类。 

扔 出异常的API很难处理。在声明方法扔出java.lang.Exception的情况下,所有的问题都会强加在API用户的头上,这样他们就无法以一种 专业的编程方式来处理异常。通过为扔出API声明Exception类的子类这一举措,API开发人员就可以减轻用户的负担。 

以上提到的两种技术在处理异常时还可能用得更好、更适当。嵌套技术令异常扔到另一异常的内部,而捕获适当的异常令程序调试大大简化。

  • 大小: 36.5 KB
分享到:
评论

相关推荐

    java 异常总结

    当一个应用试图通过Java的new操作符构造一个抽象类或者接口时抛出该异常. java.lang.InternalError 内部错误。用于指示Java虚拟机发生了内部错误。 java.lang.LinkageError 链接错误。该错误及其所有子类指示某个类...

    有效处理Java异常三原则

     在有效使用异常的情况下,异常类型回答了“什么”被抛出,异常堆栈跟踪回答了“在哪“抛出,异常信息回答了“为什么“会抛出,如果你的异常没有回答以上全部问题,那么可能你没有很好地使用它们。有三个原则可以...

    JAVA上百实例源码以及开源项目源代码

    从内存中清除,从账户中取出amt,如果amt>账户余额抛出异常,一个实体Bean可以表示不同的数据实例,我们应该通过主键来判断删除哪个数据实例…… ejbCreate函数用于初始化一个EJB实例 5个目标文件,演示Address ...

    JAVA上百实例源码以及开源项目

    从内存中清除,从账户中取出amt,如果amt>账户余额抛出异常,一个实体Bean可以表示不同的数据实例,我们应该通过主键来判断删除哪个数据实例…… ejbCreate函数用于初始化一个EJB实例 5个目标文件,演示Address ...

    JAVA基础课程讲义

    异常的处理办法之三,手动抛出异常,throw子句 103 自定义异常 103 使用异常机制建议 104 总结 105 思考作业 105 上机作业 105 第五章 数组 106 数组概述和特点 106 创建数组和初始化 106 数组常见操作 108 数组的...

    Java开发常见问题总结.docx

    不要过度使用try-catch,应尽量抛出业务异常给上层处理。 使用finally块进行资源清理。 并发编程: 使用synchronized关键字或Lock接口进行同步控制。 利用ExecutorService进行多线程任务管理。 注意volatile关键字...

    corejava培训文档

    8.10. 抛出你自己的异常 9. 八 图形用户接口 10. 九 AWT(Abstract Window Toolkit) 事件模型 11. 十 The AWT Component Library 12. 十一 JFC(Java Foundation Classes) 13. 十二 Applets 14. 十三 线程...

    java学习笔记 初学者必读

    8.10. 抛出你自己的异常 8-40 9. 八•图形用户接口 9-40 10. 九•AWT(Abstract Window Toolkit) 事件模型 10-41 11. 十•The AWT Component Library 11-41 12. 十一•JFC(Java Foundation Classes) 12-41 13. ...

    LengendOfDong#Blog#如何使用异常处理机制1

    以下三大原则可以帮你很好的使用异常处理机制:具体明确(异常类型)提早抛出(1抛更具体的异常类型,2 更好的定位)延迟捕获 (在能处理的时候捕获,而不是把它‘吃掉

    corejavaNoteBook

    8.10. 抛出你自己的异常 8-40 9. 八•图形用户接口 9-40 10. 九•AWT(Abstract Window Toolkit) 事件模型 10-41 11. 十•The AWT Component Library 11-41 12. 十一•JFC(Java Foundation Classes) 12-41 13. ...

    面向对象技术与UML课件及源代码-by 南邮-陈杨

    9.3异常的向前抛出 9.3.1为什么要向前抛出 9.3.2如何向前抛出 9.4自定义异常 9.4.1为什么需要自定义异常 9.4.2如何自定义异常 9.5小结 第10章Java常用API 10.1数值运算 10.1.1用Math类实现数值运算 10.1.2...

    C++数据抽象和问题求解(第6版).[美]Frank M. Carrano(带详细书签).pdf

    C3.3 抛出异常 224 C3.4 处理异常 227 C3.4.1 多个catch块 228 C3.4.2 未捕获的异常 229 C3.5 程序员定义的异常类 232 第7章 实现ADT栈 235 7.1 基于数组的实现 236 7.2 基于链表的实现 239 7.3 在实现中...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    6.3.1 抛出异常 253 6.3.2 捕获异常 254 6.3.3 MFC中的异常处理 255 6.4 处理内存分配错误 256 6.5 函数重载 257 6.5.1 函数重载的概念 258 6.5.2 引用类型和重载选择 260 6.5.3 何时重载函数 260 6.6 函数...

Global site tag (gtag.js) - Google Analytics