`
sungang_1120
  • 浏览: 326356 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类

Effective Java学习(异常)之——对可恢复的情况使用受检异常,对编程错误使用运行时异常

阅读更多

java程序设计语言提供了三种可抛出结构:

1,受检的异常(checked exception)

2,运行时异常(run-time exception)

3,错误(error)

       关于什么时候适合使用哪种可抛出结构,程序员中间存在一些困惑。虽然这项决定并不总是那么清晰吗、,但还是有一般性的原则提供了强有力的指导。

 

       再决定使用受检的异常或者未受检的异常时,主要的原则是:如果期望调用者能够蛇胆的恢复,对于这种情况就应该受用受检的异常 。通过抛出受检的异常,强迫调用者在一个catch子句中处理该一场,或者将它传播出去。因此,方法中声明要抛出的每个受检的异常,都是对API用户的一种潜在指示:与异常相关联的条件是调用这个方法的一种可能结果。

 

      API的设计者让API用户面对受检异常,以此强制用户从这个异常条件中恢复。用户都不需要也不应该被捕获的可抛出结构,如果程序抛出未受检的异常或者错误,往往就属于不可恢复的情形,继续执行下去有益无害。如果程序没有捕捉到这样的可抛出结构,将会导致当前线程停止,并出现适当的错误消息。

 

       用运行时异常来表明编程错误。大多数的运行时异常都表示前提违例。所谓前提违例是指API的客户没有遵守API规范建立的约定。如果,数组访问的约定指明了数组的下标值必须在零和数组长度减1之间。ArrayIndexOutBoundsException表明这个前提被违反了。

 

      虽然JLS(Java语言规范)并没有要求,但是按照惯例,错误往往被JVM保留用于表示资源不足、约束失败、或者其他使程序无法继续执行的条件,由于这已经是个几乎被普遍接受的惯例,因此最好不要再实现任何新的Error子类。因此,你实现的所有未受检的抛出结构都应该是RuntimeException的子类(直接活间接的)。

 

       要想定义一个抛出结构,他不是Exception  EuntimeException Error的子类,这也是可能的,JLS并没有直接规定这样的抛出结构,而是隐式的指定了:从行为意义上讲它们等同于普通的受检一擦好难过(即Exception的子类,但不是RuntimeException的子类)。那么,什么时候应该使用这样的抛出结构呢?总之,永远也不会用到,他与普通的受检异常相比没有任何益处,只会困扰API的用户。

 

       总而言之,对于可恢复的情况,使用受检异常,对于程序错误使用运行时异常。当然,情况并不总是那么黑白分明,例如,考虑资源枯竭的情形,这可能是由于程序错误引起的,比如分配了一块不合理过大的数组,也可能确实是由于资源不足而引起的。如果资源枯竭是由于临时的短缺,或者临时需求太大所造成的,这种情况可能就是可恢复的。API设计者需要判断这样的资源枯竭是否允许恢复。如果你相信一种情况可能允许恢复,就是用受检的异常,如果不是,则使用运行时异常,如果不清楚是否有可能恢复,最好使用未受检的异常,

 

      API的设计者往往会忘记,异常也是个完全意义上的对象,可以在他上面定义任意的方法,这些方法的主要用途是为了捕捉异常的代码而提供额外的信息,特别是关于引发这种异常条件的信息,如果没有这样的方法,程序员必须要懂得如何解析“该异常的字符串表示法”,以便获取这些额外信息。这是极为不好的做法,类很少会指定他们的字符串表示法中的细节,因此,不同的实现,不同的版本,字符串表示法会大相径庭,因此,”解析异常的字符串表示法:的代码可能是不可移植的,也是非常脆弱的。

 

      因为受检的异常往往指明了可恢复的条件,所以,对于这样的异常,提供一些辅助的方法尤其重要,通过这些方法,调用者可以获取一些有助于恢复的信息。例如,假设因为用户没有存储足够数量的钱,他企图在一个收费电话上进行呼叫就会失败,于是抛出受检的异常。这个异常应该提供一个访问方法,以便允许客户查询所缺的费用金额,从而可以将这个数值传递给电话用户。

分享到:
评论

相关推荐

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

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

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

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

    JAVA异常处理机制——经验与技巧.pdf

    对于Java开发者而言,深入理解并熟练运用异常处理机制,不仅能提升代码的可读性和可维护性,更是确保程序在遇到异常情况时能够妥善处理,保障用户数据安全和程序运行的连续性。本文将围绕Java异常处理机制展开,探讨...

    Java第二十九——三十一讲总结-异常处理.doc

    在Java编程中,**异常**是一种用来处理程序运行过程中可能出现的错误或者不寻常情况的机制。异常不仅可以帮助开发者捕获和处理错误,还可以用于实现一些特殊的流程控制逻辑。 Java中的异常处理主要包括两大类:**...

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

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

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

    Java异常处理是编程中的关键组成部分,它确保了程序的健壮性和可维护性。异常是程序在运行过程中遇到的问题,Java通过异常类来封装这些错误信息。在Java中,所有的异常都继承自`Throwable`类,这个类有两个主要的...

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

    Java异常处理机制是Java编程中不可或缺的一部分,它确保程序在遇到错误或异常情况时能够优雅地处理问题,而不是突然崩溃。异常(Exception)是程序运行过程中遇到问题的表示,Java提供了一系列内置异常类,例如...

    浅谈Java异常.pdf

    Java异常处理机制是Java编程语言的一个重要组成部分,它提供了处理运行时错误的标准方法。在Java中,异常是指程序在执行过程中发生的一些不寻常的事件,它会打断正常的程序流程。Java提供了丰富的异常类层次结构,以...

    (2条消息) Java异常面试题(2020最新版)_ThinkWon的博客-CSDN博客_java异常面试题1

    - 直接抛出异常:当遇到错误情况时,使用`throw new ExceptionType("错误信息")`。 - 封装异常再抛出:当需要增加更多的上下文信息时,先捕获异常,然后包装成自定义异常再抛出。 - 捕获异常:使用`try-catch`...

    java异常分类.pdf

    异常处理是Java编程中的一项重要技能,它不仅涉及到try-catch语句块的使用,还包括了异常的抛出(throw)和声明(throws),以及对异常信息的记录和调试。Java异常处理机制允许程序在发生错误时,通过异常对象来传递...

    Java异常处理-异常处理知识点总结及企业真题

    在实际编程中,对运行时异常的处理往往更加灵活,因为它们可以在程序的任何位置发生,而编译时异常则需要在编译期间显式处理。使用`throws`关键字可以声明方法可能会抛出的异常,将异常处理的责任交给调用者。另外,...

    Java异常面试题 33道.pdf

    在Java编程中,异常处理是保证程序健壮性和稳定运行的重要机制。Java的异常处理机制能够让开发者清晰地识别和处理程序运行过程中可能遇到的问题。本文详细讲解了Java异常的架构体系以及异常处理中的常用关键字。 ...

    Java异常面试题 33道1

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

    03-Java异常面试题目

    Java异常处理是编程中不可或缺的一部分,它帮助开发者识别和处理程序运行过程中的错误和异常状况。Java的异常体系结构基于`Throwable`类,它是所有异常和错误的基类。`Throwable`有两个主要子类:`Error`和`...

    03-Java异常面试题.docx

    Java 异常处理的最佳实践包括在 finally 块中清理资源或者使用 try-with-resource 语句,优先明确的异常,对异常进行文档说明,使用描述性消息抛出异常,优先捕获最具体的异常,不要捕获 Throwable 类,不要忽略异常...

    java异常汇总.txt

    而非受检异常则包括运行时异常(RuntimeExceptions)和其他错误,这些异常通常由于编程错误导致,应在设计时避免。 #### 1. ArithmeticException - 算术异常 当Java虚拟机尝试执行算术运算时遇到不可接受的操作,...

    深入理解java异常处理机制

    - **运行时异常**:如`NullPointerException`、`ArrayIndexOutOfBoundsException`等,这些异常在编译时不会被检查,通常由于编程错误引起。 - **受检异常**:如`IOException`、`SQLException`等,这些异常必须在...

    Java异常面试题 33道

    Java异常是通过`throw`关键字抛出的,这允许程序在遇到不可预见的情况时中断执行流程。异常处理的结构通常包括`try`、`catch`、`finally`和`throws`关键字。`try`块包含可能抛出异常的代码,`catch`块用于捕获并...

    Java异常架构详细介绍与说明(值得珍藏)

    Java异常架构是Java编程语言中一个至关重要的组成部分,它为开发者提供了一套系统化处理程序运行时错误和异常情况的机制。异常处理使得程序能够优雅地处理错误,保持代码的可读性和健壮性。 首先,`Throwable`是...

Global site tag (gtag.js) - Google Analytics