Exception和继承自Exception的RuntimeException区别

转载 2016年05月31日 21:48:45
Java compiler要求所有的Exception 要么被catch,要么被throw,除非这是一个RuntimeExeption (e instanceof RuntimeException)。也就是说,通常的Exception一定要被处理,也即我们所说的 checked exception,而RuntimeException不强制要求处理,(当然你自己要处理也可以),所以我们称为unchecked exception。 
之所以区分 checked/unchecked exception,JAVA的设计思想是区分从类/方法设计者角度来看两种不同的异常: 
一种是设计者认为这个方法在使用过程中使用者能够处理的异常,这些往往作为checked exception。比如一个IO系统的设计者会认为诸如物理文件不存在或者介质无法读取等异常时很可能发生,而使用者完全可能捕获这个异常,通过让用户重新输入文件名等方式重新进行这个操作,也就是说,这是一个可恢复的操作。所以我会在诸如 read()/write()等操作中throw 一个 IOException(checked exception)。 
第二种是设计者认为使用者不能够处理的异常,比如我写一个函数要求传入的参数是个正数,那么当我发现使用者传了个负数进来时,合理的预期是程序中出bug了。如果我抛出一个异常描述这件事,即使我要求调用者捕获这个异常,他肯定也不知道该怎么办(总不能随便传一个正数进来吧)。这时候我就会抛出一个IllegalArgumentException(uncheck exception),这里面的潜台词是:小子,我知道你也是帮人背黑锅的,处理不了这个,你还是交给你的领导(调用你的程序)去处理这个异常吧。 
同理,当JVM发现除数为0时,抛出的ArithmeticException也是一个unchecked exception。 

从这里可以看出,checked exception和 unchecked exception的根本区别在于设计者认为使用者是否能够并且应该处理这个异常。不幸的是,由于Java使用者水平的参差不齐,大量的unchecked exception该被设计成了checked exception,而对于真正的checked exception,又有太多被catch了之后啥都不作就悄无声息了。尤其是不声不响吞噬exception的行为,不但达不到设计者本来的要求(进行恢复处理),甚至问题更大(连 unchecked exception那种最后报错的效果都没了)。 

所以, C#在异常处理上采用了完全不同的思路,把所有的的exception都设计为 unchecked exception,也就是说,它基于这样一种思路: 我不要求任何人处理任何异常;如果你能处理,那么你就显示catch这种异常;如果某种异常没有人catch,那么系统最终会崩溃。


ps:

RuntimeException 是属于unchecked (java 编译器允许不catch)表示一类 未知的不确定的只有在运行时才会出现的异常。 
而非RuntimeException 是checked (java 编译器必须要求 catch),大概指一类可以预知的,当发生异常后知道如何处理的异常,所以需要捕获。


相关文章推荐

每天一点儿java---继承exception类来实现自己的异常类

继承exception类来实现自己的异常类

Exception和继承自Exception的RuntimeException有什么区别

Java compiler要求所有的Exception 要么被catch,要么被throw,除非这是一个RuntimeExeption (e instanceof RuntimeException)。...

JAVA异常总结 ------ 继承(转载)

以下是对JAVA异常的继承机制的一些总结。   1. RuntimeException与Exception, Error不同点: 当方法体中抛出非RuntimeException(及其子类...

error和exception的区别,RuntimeException和非RuntimeException的区别

1. 异常机制       异常机制是指当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。       传...

修改Idea默认的全局设置,如Maven等

用idea有一段时间了,每次用idea打开一个新项目,总是把东西下到默认的C盘去了!!! 非常非常的不开心有没有,于是下了决心,干掉它!! 查了一下,其实官网就有说明(英文的)...

JAVA工程师最新面试题(来源于互联网)

面向对象编程(OOP)Java是一个支持并发、基于类和面向对象的计算机编程语言。下面列出了面向对象软件开发的优点:代码开发模块化,更易维护和修改。 代码复用。 增强代码的可靠性和灵活性。 增加代...
  • xyisv
  • xyisv
  • 2017-08-29 20:28
  • 188

面试题总结 —— JAVA高级工程师

面试题总结——JAVA高级工程师 近期考虑换工作的问题,于是投简历面试,面试5家公司的高级Java工程师,有4家给了我offer,想着总结一下面试经验,方便最近正在寻求机会的你们 一、无笔试题 ...

RuntimeException

总结了一下JAVA中常见的几种RuntimeException,大约有如下几种:NullPointerException - 空指针引用异常ClassCastException - 类型强制转换异常。...

java工程师面试题大全-100%公司笔试题你都能碰到几个

Java hibernate中离线查询去除重复项怎么加条件?? dc.setResultTransformer(Criteria.DISTINCT_ROOT_ENT...

ibatis改Mybatis经验之返回自增长列值

最近在将ibatis框架改为Mybatis框架时,遇到mybatis框架无法按照原先的xml文件语句,将ibatis中的自增长列值进行返回的情况!   原ibatis代码 inser...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)