Exception和继承自Exception的RuntimeException区别
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),大概指一类可以预知的,当发生异常后知道如何处理的异常,所以需要捕获。
Exception和继承自Exception的RuntimeException区别相关推荐
- Throwable、Error、Exception、RuntimeException 区别 联系
2019独角兽企业重金招聘Python工程师标准>>> 1.Throwable 类是 Java 语言中所有错误或异常的超类.它的两个子类是Error和Exception: 2.Err ...
- Throwable、Error、Exception、RuntimeException 区别
1.Throwable 类是 Java 语言中所有错误或异常的超类.它的两个子类是Error和Exception: 2.Error 是 Throwable 的子类,用于指示合理的应用程序不应该试图捕获 ...
- 【总结】Throwable/Error/Exception/RuntimeException区别
[总结]Throwable/Error/Exception/RuntimeException区别 1.JAVA是将所有的错误封装为一个对象,其根本父类为Throwable,有两个子类:Error和Ex ...
- check在java意思吗_谈谈Java:Checked Exception与 unCheckException Runtime Exception 的区别...
Java里有个很重要的特色是Exception ,也就是说允许程序产生例外状况.而在学Java 的时候,我们也只知道Exception 的写法,却未必真能了解不同种类的Exception 的区别. 首 ...
- Exception in thread main java.lang.RuntimeException: org.apache.hadoop.security.AccessControlExcep
hadoop在使用时,由于权限问题,没有解决,导致报错,如下,是我使用hive时,导致的错误. Exception in thread "main" java.lang.Runti ...
- 每日分享 环境报错:Exception in thread “main“ java.lang.RuntimeException: Cannot create staging directory
Exception in thread "main" java.lang.RuntimeException: Cannot create staging directory 'hd ...
- bin/hive出错:Exception in thread main java.lang.RuntimeException: java.net.ConnectException: Call Fr
安装好Hive后使用bin/hive命令启动hive,出现错误: Exception in thread "main" java.lang.RuntimeException: ja ...
- Exception in thread main java.lang.RuntimeException: java.net.ConnectException错误问题
之前可以打开hive服务,后又出现错误: Logging initialized using configuration in jar:file:/opt/app/hive/lib/hive-comm ...
- php catch e是什么,php try catch 中的catch(Exception $e) 中的Exception 有什么作用?
如题. Exception 是起作用域的作用吗?还是语言结构? 首先很明确的是 try - catch - 是一个语言结构. 那既然如此就不能用函数参数类型限定的方式去理解 catch 后面的括号里的 ...
最新文章
- 两位院士同时受聘,山东大学再添强援
- docker网络之macvlan
- 从HttpServletRequest获取完整的请求路径
- LintCode: 3 Sum
- 负载均衡的几种方式_负载均衡的几种方式
- strassen矩阵乘法 java_Strassen 矩阵算法 Java 实现
- 计算机系统-任务切换
- 支持pygame的python有哪些版本_完整构建文件支持PYGAME
- 《Cracking the Coding Interview》——第8章:面向对象设计——题目9
- 一次性删除maven本地仓库下的.lastUpdated 结尾的文件
- linux sh指令自动验证密码,shell脚本自动输入用户名和密码更新服务器上的git项目...
- 五款超好用ZBrush笔刷(文末附下载链接)
- RFM模型实现用户分层
- 2019软科【世界一流计算机学科排名】公布!
- 阿里云Oss水印图片处理Utils
- Maven_Maven简介
- 使用tinymce编辑器从word保持原格式复制粘贴的办法
- cgb2111-day02
- [2015 Springer] Local Image Descriptor: Modern Approaches——2 Classical Local Descriptors
- 我叫mt4最新服务器,我叫mt4怎么看服务器等级上限 经验上限查看方法详解