`
ydbc
  • 浏览: 766929 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

提高你的Java代码质量吧:受检异常尽可能转化为非受检异常

 
阅读更多

一、分析

把所有受检查异常(CheckedException)都转化为非受检查异常(UnCheckedException)”这一想法是不现实的。受检查异常是正常逻辑的一种补偿处理手段,特别是对可靠性要求比较高的系统来说,在某些条件下必须抛出首检异常以便由程序进行补偿处理,也就说受检异常又合理的存在理由,那为什么需要把受检异常转化为非受检异

常?

受检异常确实有不足的地方

1.受检异常使接口声明脆弱

例如,系统初始是这样设计一个接口的

interfaceUser{  
    //修改用户名,抛出安全异常  
    publicvoid changePassword() throws MySecurityExcepiton; 
} 

随着系统的开发,User接口有了多个实现者,比如普通用户UserImpl、模拟用户MockUserImpl(用作测试或系统管理)、非实体用户NonUserImpl(如自动执行机、逻辑处理器等),此时如果发现changePassword方法可能还需要抛出RejectChangeException(拒绝修改异常,如自动执行正在处理任务时不能修改其密码),那就需要修改User接口了:changePassword方法增加抛出了RejectChangeException异常,这就会导致所有的User调用者都要追加对RejectChangeException异常的处理。

这就产生了两个问题:一是异常是主逻辑的补充逻辑,修改一个补充逻辑,就会导致主逻辑的修改,这就出现了实现类“逆影响”接口的情景;二是实现类变更最终会影响到

调用者,破坏了封装性。

2.受检异常使代码可读性降低

一个方法增加了受简异常,则必须有一个调用者对异常进行处理,比如无受检异常方法doStuff()是这样调用的

public static void main(String[] args){  
    doStuff();  
}

doStuff方法一旦增加了首检异常就不一样了,代码如下

publicstatic void main(String[] args){  
    try{  
        doStuff();  
    }catch(Exceptione){  
        e.printStackTrace();  
    }  
} 

doStuff方法增加了throwsException,调用者就必须至少增加4条语句来处理该异常,代码膨胀了许多,可读性也降低了。

3.受检异常增加开发工作量

我们知道异常需要封装和传递,和封装才能让异常更容易理解,上层模块才能更好的处理问题,可这也会导致低层次的异常没完没了的封装,无端加重了开发的工作。

比如,FileNotFoundException在持久层抛出,就需要定义一个MyException进行封装,并抛出到上一个层级,于是增加了开发量。

受检查异常又这么多缺点,那有没有什么办法可以避免或减少这些确定呢?有,很简单的一个规则:将受检查异常转化为非检查异常即可,但是我们也不能把所有的受检查

异常转化为非受检查异常,原因是在编码上层模块不会知道下层模块会如何抛出何种非受检异常,只有通过规则或文档来约束,可以这样说:

a.受检异常提出的是“法律下的自由”,必须遵守异常的约定才能自由编写代码

b.非受检异常则是“协约性质的自由”,你必须告诉我你要抛出什么异常,否则不会处理

二、场景

那么在开发和设计时,什么样的受检异常有必要转发为非受检异常呢?“尽可能”是以什么作为判断依据呢

受检查异常转化为非受检异常是需要根据项目的场景来决定的。例如同样是刷卡,员工拿着自己的工卡到考勤机上打考勤,此时如果附近又磁场物质干扰,则考勤机可以把

这种受检异常转化为非首检异常,黄灯闪烁后不做任何登记,因为考勤失败这种场景不是“致命”的业务逻辑,出错了,重新刷一下即可。但是到银行网点刷卡取钱就不一样

了,拿着银行卡到银行取钱,同样有磁场干扰,刷不来,这种异常就必须登记处理,否则会称为威胁银行卡安全的事件。

三、建议

汇总成一句话:当受检异常威胁了系统的安全性、稳定性、可靠性、正确性的时候,则必须处理,不能转化为非受检异常,其它情况则可以转化为非受检异常。

分享到:
评论

相关推荐

    Java异常面试题 33道1

    本文将深入探讨Java异常的相关知识点,包括Java异常简介、异常架构、受检异常与非受检异常,以及Java异常处理的关键字。 1. Java异常简介: Java异常是程序在执行过程中遇到的不正常情况,它通过异常对象来表示。...

    Java语言程序设计:ch06 异常处理、递归和单体程序设计方法.ppt

    Java将异常分为两类:受检异常(Checked Exception)和非受检异常(Unchecked Exception)。 受检异常在编译时就需要被处理,这意味着如果方法可能抛出受检异常,那么该方法必须用`throws`关键字声明,或者在方法...

    Java并发编程示例(八):处理线程的非受检异常

    Java为处理线程的非受检异常提供了一个机制,即通过实现`Thread.UncaughtExceptionHandler`接口。当线程因非受检异常终止时,会调用这个接口的`uncaughtException()`方法,从而允许开发者自定义异常处理逻辑,防止...

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

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

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

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

    Java异常是Java提供的一种识别及响应错误的一致性机制,Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序

    Java异常处理是编程中至关重要的一个方面,它提供了一种有序的方式来处理程序运行时可能出现的问题。异常机制使得异常处理代码与正常的业务逻辑得以分离,从而提高代码的可读性和维护性。 **Java异常架构** Java...

    Java异常处理.md

    Java中的异常类主要分为两大类:受检异常(Checked Exceptions)和非受检异常(Unchecked Exceptions),这两类异常均继承自`Throwable`类。 - **受检异常(Checked Exceptions)**: - 这类异常在编译阶段就必须...

    JAVA异常分类.txt

    在Java编程语言中,异常处理是确保代码健壯性和错误管理的关键部分。异常是指程序运行时出现的非正常情况,...通过了解和正确使用这些异常,开发者可以构建更稳定、更健壯的Java应用程序,提高代码的质量和可维护性。

    Java异常面试题(2024最新版).docx

    面试中,面试官可能会考察你对Java异常体系结构的理解,以及你在实际开发中如何有效地处理异常。以下是一些关于Java异常处理的关键知识点: 1. **Java异常架构**: - **Throwable**:它是所有错误和异常的基类,...

    java异常分类.pdf

    其次,异常(Exception)是程序可以处理的非正常情况,异常又可以细分为两大子类:受检异常和非受检异常。受检异常是在编译时期强制要求程序员处理的异常,如果代码中可能抛出这类异常,则必须使用try-catch块来捕获...

    03-Java异常面试题目

    非受检异常,如`NullPointerException`,是程序逻辑错误,Java编译器不会强制要求处理,但建议最好进行捕获。 Java异常处理的关键字包括`throw`和`throws`。`throw`用于主动抛出一个异常,而`throws`则用于声明一个...

    Java异常面试题 33道.pdf

    Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。在有效使用异常的情况下,异常能清晰的回答what, where, why这3个问题:异常类型回答了“什么”被抛出,异常...

    java异常有关的习题.docx

    Java 语言中异常可以分为两类:受检异常(checked exception)和非受检异常(unchecked exception)。受检异常是编译器会检查的异常,例如IOException、SQLException等,而非受检异常是编译器不会检查的异常,例如...

    Java异常面试题(2020最新版).pdf

    Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。在有效使用异常的情况下,异常能清晰的回答what, where, why这三个问题:异常类型回答了“什么”被抛出,异常...

    Java异常处理机制与常见面试题解析

    此外,文章还涵盖了常见的Java异常处理面试题及其答案,如Error和Exception的区别、受检异常和非受检异常的区别、JVM如何处理异常等。 适合人群:具备一定Java编程基础的开发人员,尤其是准备Java面试的求职者。 ...

    10道Java常见异常面试题含答案(很全)

    2. **运行时异常与受检异常的区别**:运行时异常是RuntimeException及其子类,编译器不会强制检查,但建议尽可能处理。受检异常是Exception类的其他子类,编译器会强制要求处理,否则编译不通过。 3. **JVM处理异常...

    Java异常面试题 Java异常面试题

    Java异常处理是编程中的关键组成部分,它确保了程序的健壮性...总结来说,理解Java异常体系和处理机制是成为一名专业Java开发者的基础,合理的异常处理可以提高代码质量,降低维护成本,并有助于快速定位和解决问题。

    Java异常面试题 33道

    `try`块包含可能抛出异常的代码,`catch`块用于捕获并处理异常,`finally`块确保无论是否发生异常,某些代码总会被执行,如资源清理。`throws`关键字用于方法签名中,表明该方法可能抛出异常,将异常处理的责任交给...

    java异常专题.txt

    在Java中,合理地使用异常处理机制可以显著提高程序的质量和可维护性。理解异常的分类、生命周期以及如何正确地使用try-catch-finally、throw和throws关键字对于编写健壮的Java应用程序至关重要。通过本专题的学习,...

    浅谈Java异常.pdf

    Java异常处理机制是Java编程语言的一个重要组成部分,它提供了处理运行时错误的标准方法。在Java中,异常是指程序在执行过程中发生的一些不寻常的事件...正确理解和运用异常处理机制对于编写高质量的Java代码至关重要。

Global site tag (gtag.js) - Google Analytics