`

!!!!!!!!!!!!!!!!!!Checked Exceptions !!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    博客分类:
  • Java
阅读更多

http://www.iteye.com/topic/2038?page=1

 

一个很好的讨论贴。

 

-------------------

使用Checked Exception还是UnChecked Exception的原则,我的看法是根据需求而定。 

如果你希望强制你的类调用者来处理异常,那么就用Checked Exception; 
如果你不希望强制你的类调用者来处理异常,就用UnChecked。 

那么究竟强制还是不强制,权衡的依据在于从业务系统的逻辑规则来考虑,如果业务规则定义了调用者应该处理,那么就必须Checked,如果业务规则没有定义,就应该用UnChecked。 

还是拿那个用户登陆的例子来说,可能产生的异常有: 

IOException (例如读取配置文件找不到) 
SQLException (例如连接数据库错误) 
ClassNotFoundException(找不到数据库驱动类) 

NoSuchUserException 
PasswordNotMatchException 

以上3个异常是和业务逻辑无关的系统容错异常,所以应该转换为RuntimeException,不强制类调用者来处理;而下面两个异常是和业务逻辑相关的流程,从业务实现的角度来说,类调用者必须处理,所以要Checked,强迫调用者去处理。 

在这里将用户验证和密码验证转化为方法返回值是一个非常糟糕的设计,不但不能够有效的标示业务逻辑的各种流程,而且失去了强制类调用者去处理的安全保障。 

至于类调用者catch到NoSuchUserException和PasswordNotMatchException怎么处理,也要根据他自己具体的业务逻辑了。或者他有能力也应该处理,就自己处理掉了;或者他不关心这个异常,也不希望上面的类调用者关心,就转化为RuntimeException;或者他希望上面的类调用者处理,而不是自己处理,就转化为本层的异常继续往上抛出来。

--------------------

异常类层次设计的不好带来的结果就是非常糟糕,例如JTA的异常类层次,例如EJB的异常类层次,但是也有设计的很好的,例如Spring DataAccessException类层次结构。 

用设计糟糕的异常类层次来否定异常这个事物,是极度缺乏说服力的,就好像有人用菜刀砍了人,你不能否定这把菜刀一样。 

这个帖子这么长了,该讨论的问题都讨论清楚了,总结也总结过n遍了,所以我早就没有兴趣再跟帖了。 

实际上,这个讨论中隐含两个不断纠缠的话题: 

1、checked ,还是unchecked异常? 
2、用自定义的方法调用返回code,还是用异常来表达不期望各种的事件流 

经过这么长的讨论,我认为结论已经非常清楚: 

1、应该适用unchecked异常,也就是runtimeexception,这样可以让无法处理异常的应用代码简单忽略它,让更上层次的代码来处理 

2、应该适用异常来表达不期望的各种事件流 

事实上,你们去看一下现在Spring,Hibernate3都已经采用这种方式,特别是Spring的DataAccessException异常层次设计,是一个很好的例子。即使用RuntimeException来表达不期望的各种事件流。

----------------------------------------

---------------------------------------------------------------------

 常见的runtimeexception:

  1. NullPointerException - 空指针引用异常  
  2. ClassCastException - 类型强制转换异常。  
  3. IllegalArgumentException - 传递非法参数异常。  
  4. ArithmeticException - 算术运算异常  
  5. ArrayStoreException - 向数组中存放与声明类型不兼容对象异常  
  6. IndexOutOfBoundsException - 下标越界异常  
  7. NegativeArraySizeException - 创建一个大小为负数的数组错误异常  
  8. NumberFormatException - 数字格式异常  
  9. SecurityException - 安全异常  
  10. UnsupportedOperationException - 不支持的操作异常  

 

 

 

 

 

分享到:
评论

相关推荐

    JAVA思维导图9张!

    3. **异常处理**:这部分可能会讲解如何使用try-catch-finally语句来捕获和处理异常,以及不同类型的异常类,如检查异常(Checked Exceptions)和运行时异常(Unchecked Exceptions)。 4. **集合框架**:Java集合...

    speakeasy:Speakeasy-简单的简单密码术,很难做错事

    说话容易Speakeasy-简单的简单密码术,很难做错事前言...快速范例如何使用Speakeasy进行哈希处理: public class MyThing {// Wahoo no stupid checked exceptions!private final Fingerprinter fingerprinter = new S

    Java精华(免费版)

     从逻辑的角度来说,checked exceptions和runtime exception是有不同的使用目的的。checked exception用来指示一种调用方能够直接处理的异常情况。而runtime exception则用来指示一种调用方本身无法处理或恢复...

    exceptions1-java

    2. **异常的分类**:异常类可以进一步分为检查型异常(Checked Exceptions)和运行时异常(Unchecked Exceptions)。检查型异常是那些在编译时必须处理的异常,如`IOException`,而运行时异常则是在程序运行时抛出,...

    exceptions

    标题"exceptions"直接指向了这一主题,表明我们将深入探讨Java中的异常处理机制。 异常(Exception)是Java程序运行时发生的错误事件,它可以打断程序的正常流程。Java使用了一个基于类的、链式的异常处理模型,这...

    麻省理工18年春软件构造课程阅读06-规格说明-1

    Checked exceptions(如IOException)是编译时需要处理的异常,而unchecked exceptions(如NullPointerException)则在运行时检查。在Java中,程序员通常需要显式地捕获或声明checked exceptions,而在Python中,...

    Java反射封装库joor.zip

     }}// There are many checked exceptions that you are likely to ignore anyway catch (Exception ignore) { // ... or maybe just wrap in your preferred runtime exception: throw new RuntimeException(e);...

    Android代码-fest-reflect

    FEST-Reflect provides an intuitive, compact and type-safe fluent API that makes Java reflection tremendously easy to use: no more casting, checked exceptions, PriviledgedActions or calls to ...

    jicheng400#effective-java-3rd-chinese#70. 对可恢复的情况使用受检异常,对编程错误使用运

    70. 对可恢复的情况使用受检异常,对编程错误使用运行时异常Java 程序设计语言提供了三种 throwable:受检异常(checked exceptions

    ihukaijun#effective-java-3rd-chinese#70. 对可恢复的情况使用受检异常,对编程错误使用运行

    70. 对可恢复的情况使用受检异常,对编程错误使用运行时异常Java 程序设计语言提供了三种 throwable:受检异常(checked exceptions

    java english interview

    * Java 定义了两种类型的异常:checked exceptions 和 unchecked exceptions。 * Checked exceptions:继承自 Exception 类的异常,客户端代码必须处理这些异常,可以在 catch 子句中捕获或使用 throws 子句将其传递...

    Curso_JAVA-CAP15_Exceptions

    在Java中,有两种类型的异常:检查异常(Checked Exceptions)和运行时异常(Unchecked Exceptions)。检查异常是在编译时强制处理的,例如IOException,需要在方法签名中使用throws声明或在方法体内用try-catch处理...

    java异常讲解

    Java中的异常分为两大类:**检查性异常**(Checked Exceptions)和**运行时异常**(Runtime Exceptions)。 1. **检查性异常**:这类异常是由编译器强制处理的,也就是说,如果方法有可能抛出检查性异常,那么要么...

    Java-CustomExceptions:Java 自定义异常

    Java异常分为两种类型:未检查异常(Unchecked Exceptions)和检查异常(Checked Exceptions)。自定义异常如果继承自`RuntimeException`或其子类,将成为未检查异常,否则默认为检查异常。未检查异常在编译时不强制...

    exceptions-logging

    2. 异常分类:Java中的异常分为检查型异常(Checked Exceptions)和运行时异常(Unchecked Exceptions)。检查型异常在编译时必须处理,例如`IOException`;运行时异常则在运行时抛出,如`NullPointerException`,...

    Java语言程序设计基础篇课后题答案-Chapter17ExceptionsandAssertions.pdf

    本资源对Java语言程序设计基础篇的Chapter 17 Exceptions and Assertions进行了详细的解释和知识点总结,涵盖了Java异常类的继承结构、claiming exceptions、checked exception和unchecked exception、throw语句和...

    vgv-exceptions:Java库,用于面向对象的异常处理

    异常处理功能在CheckedScalar / ScalarWithFallback和相关的Checked*类中实现。 更多细节如何使用。 最新版本< dependency> < groupId>hr.com.vgv</ groupId> < artifactId>vgv-exceptions</ artifactId> ...

    Effective Java 3rd edition(Effective Java第三版英文原版)附第二版

    Item 70: Use checked exceptions for recoverable conditions and runtime exceptions for programming errors Item 71: Avoid unnecessary use of checked exceptions Item 72: Favor the use of standard ...

Global site tag (gtag.js) - Google Analytics