Java中检查型异常与非检查型异常的区别是什么

介绍

本篇文章给大家分享的是有关Java中检查型异常与非检查型异常的区别是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

,,,,,,,对于因为编程错误而导致的异常,或者是不能期望程序捕获的异常(解除引用一个空指针,数组越界,除零,等等),为了使开发人员免于处理这些异常,一些异常被命名为非检查型异常(即那些继承自RuntimeException的异常)并且不需要进行声明。

<强>检查异常和未检查异常的几点不同之处
,,,,,,,方法签名是否需要声明例外,调用该方法时是否需要捕获例外,例外产生的时候JVM控制程序的状态。

<强>太阳的“Java教程”观点
,,,,,,,因为Java语言并不要求方法捕获或者指定运行时异常,因此编写只抛出运行时异常的代码或者使得他们的所有异常子类都继承自RuntimeException,对于程序员来说是有吸引力的。这些编程捷径都允许程序员编写Java代码而不会受到来自编译器的所有挑剔性错误的干扰,并且不用去指定或者捕获任何异常。尽管对于程序员来说这似乎比较方便,但是它回避了Java的捕获或者指定要求的意图,并且对于那些使用您提供的类的程序员可能会导致问题。

,,,,,,,检查型异常代表关于一个合法指定的请求的操作的有用信息,调用者可能已经对该操作没有控制,并且调用者需要得到有关的通知,例如,文件系统已满,或者远端已经关闭连接,或者访问权限不允许该动作。

,,,,,,,如果您仅仅是因为不想指定异常而抛出一个RuntimeException,或者创建RuntimeException的一个子类,那么您换取到了什么呢?您只是获得了抛出一个异常而不用您指定这样做的能力。换句话说,这是一种用于避免文档化方法所能抛出的异常的方式。在什么时候这是有益的?也就是说,在什么时候避免注明一个方法的行为是有益的?答案是“几乎从不。”

,,,,,,,换句话说,Sun告诉我们检查型异常应该是准则。该教程通过多种方式继续说明,通常应该抛出异常,而不是RuntimeException,除非您是JVM。

,,,,,,,在有效的Java:编程语言指导一书中(请参阅参考资料),乔什布洛赫提供了下列关于检查型和非检查型异常的知识点,这些与“Java教程”中的建议相一致(但是并不完全严格一致):

第39条:只为异常条件使用异常。也就是说,不要为控制流使用异常,比如,在调用Iterator.next()时而不是在第一次检查Iterator.hasNext()时捕获NoSuchElementException。

第40条:为可恢复的条件使用检查型异常,为编程错误使用运行时异常。这里,布洛赫回应传统的太阳观点,运行时异常应该只是用于指示编程错误,例如违反前置条件。

第41条:避免不必要的使用检查型异常。换句话说,对于调用者不可能从其中恢复的情形,或者惟一可以预见的响应将是程序退出,则不要使用检查型异常。

第43条:抛出与抽象相适应的异常。换句话说,一个方法所抛出的异常应该在一个抽象层次上定义,该抽象层次与该方法做什么相一致,而不一定与方法的底层实现细节相一致。例如,一个从文件,数据库或者JNDI装载资源的方法在不能找到资源时,应该抛出某种ResourceNotFound异常(通常使用异常链来保存隐含的原因),而不是更底层的IOException, SQLException异常或者NamingException。

<强>一、Java中异常概述

1.1 Java异常结构

,,,,,,,Throwable可以用来表示任何可以被作为异常抛出的类.Throwable对象派生出两种类型:错误和异常,前者用来表示编译时和系统错误,程序员往往不必关心;后者是可以被抛出的基本类型,需要程序员关注.RuntimeException是例外的派生类,不同点将在2.2与2.3小结中描述。

,,,,,,Java的异常(异常)按照编译器检查方式又可以分为检查型异常(CheckedException)和非检查型异常(UncheckedException)。

1.2检查型异常(CheckedException)

,,,,,,,在Java中所有不是RuntimeException派生的异常都是检查型异常。当函数中存在抛出检查型异常的操作时该函数的函数声明中必须包含抛出语句。调用改函数的函数也必须对该异常进行处理,如不进行处理则必须在调用函数上声明抛出语句。

,,,,,,,检查型异常是JAVA首创的,在编译期对异常的处理有强制性的要求。在JDK代码中大量的异常属于检查型异常,包括IOException, SQLException异常等等。

1.3非检查型异常(UncheckedException),

Java中检查型异常与非检查型异常的区别是什么