A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何仕映 中级黑马   /  2013-3-19 09:42  /  1792 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 何仕映 于 2013-3-19 14:09 编辑

在JAVA中自定义异常通过继承Exception和RuntimeException来进行封装。我们查阅JAVA的API文档可以发现,对于Exception这个类和Throwable这个类没有任何区别,即Exception这个类除了类名不一样意外,其他的都一样。我们封装异常的时候也可以继承Throwable,那为什么还要定义Exception这个类呢?为什么不让Exception的子类直接继承Throwable呢?难道仅仅是为了区分Exception和Error吗?还有为什么非常严重的错误不继承Error呢?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

8 个回复

倒序浏览
我只知道,所有异常对象的根基类是 Throwable ,Throwable从Object直接继承而来.
这个问题我也想搞懂。
回复 使用道具 举报
Throwable有两大子类 一个是Exception,另一个是Error。Exception 类及其子类是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的具体条件,而在程序的开发编程中,更需要了解的就是该异常是具体的哪一个异常,然后进行捕获和处理。Error也是Throwable的子类,它是在应用程序不应该试图捕获的严重问题的时候才出现,而一旦出现就表示这个错误是无法在开发中被处理,这显然不是编程所需要的,所以一般用RumtimeException异常来说明,程序到这问题严重,暂时停止运行,该检查程序代码,修改了。如果用到Error那就应该是无法更改了。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
HM朱俊 发表于 2013-3-19 10:37
Throwable有两大子类 一个是Exception,另一个是Error。Exception 类及其子类是 Throwable 的一种形式,它 ...

你说的这个关于Error和RuntimeException的区别只客观加上去的啊,在自定义异常上面继承哪一个都是一模一样的。就是说在代码上面没有任何的区别啊。
回复 使用道具 举报
对照了API发现还真是如楼主所说,俩个类构造方法相似,Exception的方法也全部继承Throwable。。。或许就是为了区别出Error吧 召唤大神解惑
回复 使用道具 举报
Throwable 类是 Java 语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出,才能被catch。

Throwable类包含两个子类:Error 和 Exception。

查看API发现Error 和 Exception完全是继承了Throwable的方法,除此之外并无新方法。

为什么还要定义Error 和 Exception?
【解答】
大概来说来说是因为,他们的产生原因和处理方式不同个,所以明确这两个子类,从而可以采取对应的处理。

下面详细说明:


一、产生原因
  1、Error是程序本身无法恢复的严重错误.用来处理程序运行环境方面的异常,比如,虚拟机错误、装载错误和连接错误,这类异常主要是和硬件有关的,而不是由程序本身抛出的。
  2、Exception下面一部分子类分别对应于Java程序运行时常常遇到的各种异常的处理,其中包括隐式异常。因为它们虽然是由程序本身引起的异常,但不是程序主动抛出的,而是在程序运行中产生的,故而成为运行时异常(RuntimeException)。
  Exception 子类下面的另一部分子类对应于Java程序中的非运行时异常的处理,这些异常也称为为显示异常。

二、处理方式
  1、Error 是 Throwable 的子类,用于指示合理的应用程序不应该试图捕获的严重问题。在执行该方法期间,无需在其 throws 子句中声明可能抛出但是未能捕获的 Error 的任何子类,因为这些错误可能是再也不会发生的异常条件。
  2、Exception则表示可以被程序捕获并处理的异常错误.是 Throwable 的一种形式,它指出了合理的应用程序想要捕获的条件。Exception自身及其子类需要try-catch语句的支持。
  特别的指出一点:可能在执行方法期间抛出但未被捕获的 RuntimeException 的任何子类都无需在 throws 子句中进行声明。
回复 使用道具 举报
张亚青 发表于 2013-3-19 13:19
Throwable 类是 Java 语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,才能通过 J ...

但是在代码上面Error和RuntimeException没有任何区别,在自定义异常中,用Error去替换RuntimeException没有任何的差异。Throwable和Exception也没有任何差异,在自定义异常中是可以互换的,互换后没有任何差别。
回复 使用道具 举报
何仕映 发表于 2013-3-19 13:30
但是在代码上面Error和RuntimeException没有任何区别,在自定义异常中,用Error去替换RuntimeException没 ...

确实没有任何差别 ,只是他们的处理方式不同。

就比如同样是一样的杯子,一个用来刷牙,一个用来喝水,如果他们互相替代也没什么不可以。

这只是个比方,但是也不是很妥,因为
1、Exception中的显式异常(非RuntimeException),也就是非运行时异常,必须被try-catch语句处理,或者被声明抛出(throws);
2、RuntimeException如果没有被捕捉处理的话,则不是必须要声明;
3、Error则是不能被捕捉处理的,另外它也不是程序代码所产生的问题。

所以还是有差别的,只不过我们还没有涉及到他们的细节差别而已。


【以上是我个人观点,你可以参考一下,如有错误望大家指点】
回复 使用道具 举报
张亚青 发表于 2013-3-19 13:58
确实没有任何差别 ,只是他们的处理方式不同。

就比如同样是一样的杯子,一个用来刷牙,一个用来喝水, ...

好的,谢谢你的解答。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马