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),大概指一类可以预知的,当发生异常后知道如何处理的异常,所以需要捕获。


常见的几种RuntimeException

一般面试中java Exception(runtimeException )是必会被问到的问题 常见的异常列出四五种,是基本要求。更多的。。。。需要注意积累了   常见的几种如下:   Nu...
  • QQ635785620
  • QQ635785620
  • 2012年07月24日 16:51
  • 127225

Java中RuntimeException和Exception的区别

在java的异常类体系中,Error和RuntimeException是非检查型异常,其他的都是检查型异常。 所有方法都可以在不声明throws的情况下抛出RuntimeException及...
  • Mr_Pang
  • Mr_Pang
  • 2015年11月03日 23:32
  • 17482

哪些异常是RuntimeException?Sql异常属于RuntimeException吗?Spring下SQL异常事务回滚

更多Spring事务问题请访问链接:Spring事务回滚疑难详解 一,为什么框架中根本没有对Exception的一般子类进行回滚配置,异常发生时,事务都进行了回滚 ,说好的只会对RuntimeExce...
  • qq_32331073
  • qq_32331073
  • 2017年08月01日 14:25
  • 1487

自定义运行时异常设计(RuntimeException)

RuntimeException
  • winy_lm
  • winy_lm
  • 2016年04月05日 15:04
  • 2287

Java中常见的几种RuntimeException

总结了一下JAVA中常见的几种RuntimeException,大约有如下几种: NullPointerException - 空指针引用异常 ClassCastException - 类型强制转...
  • u011514810
  • u011514810
  • 2016年09月04日 12:19
  • 6508

runtimeException也是能够捕获的

如题, 运行结果: bbb abcdef @Test public void testRuntimeException() { int a = 0; t...
  • fangletian1981
  • fangletian1981
  • 2017年06月02日 18:44
  • 681

常见的RuntimeException

常见的RuntimeException Java中采用了强制异常捕捉机制,这样一方面提高了程序的可靠性,不过有时候也带来一些麻烦。比如: int i= Integer.parseInt("33");这...
  • pulybuffer
  • pulybuffer
  • 2008年06月06日 23:48
  • 291

java中抛出RuntimeException异常,为什么可以不用撰写代码去捕获它?

这是java的默认配置。 当你把一个异常定义在方法的throws定义中,你就可以不处理这个异常,系统会自动把该异常抛出。 而RuntimeException则是java设计中所有方法都默认定义在th...
  • ranshao528
  • ranshao528
  • 2015年11月23日 17:36
  • 4103

Throwable、Error、Exception、RuntimeException 区别 联系

1.Throwable 类是 Java 语言中所有错误或异常的超类。它的两个子类是Error和Exception; 2.Error 是 Throwable 的子类,用于指示合理的应用程序不应...
  • liuj2511981
  • liuj2511981
  • 2013年01月21日 13:34
  • 21266

源码中出现throw new RuntimeException("Stub!")的理解

在阅读源码的过程中,发现有些类只定义了方法名和参数列表,里面具体的实现就一句话:throw new RuntimeException("Stub!"); 比如BaseDexClassLoader这个...
  • anhenzhufeng
  • anhenzhufeng
  • 2017年07月17日 21:12
  • 4045
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Exception和继承自Exception的RuntimeException区别
举报原因:
原因补充:

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