Java Exception 和Error有什么区别?
① Exception 和Error 都是继承了Throwable类,在Java中只有Throwable类型的实例才可以被抛出或者捕获,它是异常处理机制的基本类型。
② Exception和Error体现了Java平台设计者对不同异常情况的分类。
⑴Exception是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。
⑵Exception又分为可检查(checked)异常和不可检查(unchecked)异常。可检查异常在源代码里必须显式的进行捕获处理,这是编译期检查的一部分。不可检查时异常是指运行时异常,像NullPointerException、ArrayIndexOutOfBoundsException之类,通常是可以编码避免的逻辑错误,具体根据需要来判断是否需要捕获,并不会在编译期强制要求。
⑶Error是指正常情况下,不大可能出现的情况,绝大部分的Error都会导致程序处于非正常的、不可恢复的状态。既然是非正常情况,不便于也不需要捕获。常见的比如OutOfMemoryError之类都是Error的子类。
③ 简单的类图,列典型例子如下

④ 理解Java语言中操作Throwable的元素和实践,掌握最基本的语法是必须的,如try-catch-finally块,throw throws关键字等。
⑤ 实例
⑴下面的代码反应了异常处理中哪些不当之处?
try{
//........
//.......
Thread.sleep(1000L);
}catch (Exception e){
//....
}
以上代码违反了两个基本原则
| 尽量不要捕获Exception这样的通用异常,而应该捕获特定异常,这里面的Thread.sleep()抛出的是InterruptedException。原因是让代码能够直观的体现出尽量多的信息,不要太泛,不好定位。
|| 不要生吞异常,否则会导致难以诊断。如果不把异常抛出来,也没有输出到日志,程序可能会以不可控的方式结束,没人能够轻易判断是哪里出了异常以及是什么原因导致了异常。
⑵
try{
//........
//.......
}catch (IOException e){
e.printStackTrace();
}
这段代码没什么问题,但在产品代码中一般不允许这样处理,原因是标准出错不是个合适的输出选项,因为很难判断到底输出到哪里了。尤其是对分布式系统,无法找到堆栈痕迹,所以最好详细的输出到日志里。
⑶ Throw early,catch late
public void readPreferences(String fielName){
//...........
InputStream in =new FileInputStream(fileName);
// read the file....
}
如果filename是空,程序会抛出NullPointerException异常,但是没第一个时间暴露问题,堆栈信息会令人非常费解,往往需要更复杂的定位修改如下:
public void readPreferences(String fielName){
Objects.requireNonNull(fileName);
//...........
InputStream in =new FileInputStream(fileName);
// read the file....
}
至于catch late,最差的处理方式就是生吞异常了,本质上就是掩盖问题。如果实在不知道如何处理,可以保留原有的case信息,直接再抛出或者构建新的异常出去。在更高层面,因为有了清晰的逻辑,会更青春合适的处理方式是什么。
⑥自定义异常
⑴是否需要定义成Checked Exception,因为这种类型设计的初衷更是为了从异常情况恢复,作为异常设计者,我们往往有充足信息进行分类
⑵在诊断信息的同时要考虑避免包含敏感信息,否则会导致潜在的安全问题。Java的标准类库出错信息不包含具体的机器名,端口,IP等,一个重要考量就是信息安全问题,还有用户数据一般不包含在日志里的
⑦ 从性能角度审视Java的异常处理机制
⑴try-catch代码段会产生额外的性能开销,它会影响JVM对代码进行优化,所以建议仅捕获有必要的代码段,尽量不要一个大的try包住整段的代码;与此同时,利用异常控制代码流程也不是一个好注意,这样非常低效。
⑵Java每实例化一个Exception,都会对当时的栈进行快照,这是一个相对较重的操作,如果发生的非常频繁,这个开销就不能被忽略了。
Java Exception 和Error有什么区别?的更多相关文章
- 《Java核心技术36讲》阅读笔记:Exception和Error有什么区别?
1.Exception 和 Error有什么区别?运行时异常与一般异常有什么区别? Exception和Error都继承自java.lang.Throwable.在Java中只有Throwable的实 ...
- 面试官:小伙子,你给我说一下Java Exception 和 Error 的区别吧?
前言 昨天在整理粉丝给我私信的时候,发现了一个挺有意思的事情.是这样的,有一个粉丝朋友私信问我Java 的 Exception 和 Error 有什么区别呢?说他在面试的时候被问到这个问题卡壳了,最后 ...
- final,finally,finalize有什么区别?String, StringBuffer, StringBuilder有什么区别?Exception和Error有什么区别?
继上篇JVM学习之后,后面将分三期深入介绍剩余JAVA基础面试题,每期3题. 题目一.final,finally,finalize有什么区别? /*请尊重作者劳动成果,转载请标明原文链接:*/ /* ...
- Exception 和 Error 有什么区别么
声明 本篇所涉及的提问,正文的知识点,全都来自于杨晓峰的<Java核心技术36讲>,当然,我并不会全文照搬过来,毕竟这是付费的课程,应该会涉及到侵权之类的问题. 所以,本篇正文中的知识点, ...
- java面试题(杨晓峰)---第二讲Exception和Error有什么区别?
本人总结: Exception和Error:正常问题和意外问题,以自行车举例:没气和爆胎. ①理解Throwable,Exception,Error的设计和分类. ②掌握哪些应用最广泛的子类, ③如何 ...
- Java学习|Exception和Error有什么区别?
典型回答: Exception和Error都继承了Throwable类,java中只有Throwable类型的实例才能被Throw(抛出)或者catch(捕获). Exceptio ...
- Java核心-02 Exception和Error有什么区别?
今天我要问你的问题是,请对比 Exception 和 Error,另外,运行时异常与一般异常有什么区别? 典型回答 Exception 和 Error 都是继承了 Throwable 类,在 Java ...
- java中exception和error有什么区别,运行时异常和一般异常有什么区别
1.exception和error都是继承了throwable类,在java中只有throwable类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型 2.ex ...
- Java Exception 和Error
(事先声明:该文章并非完全是我自己的产出,更多的是我个人在看到资料后通过理解并记录下来,作为自己阅读后的一个笔记:我现在试图对自己多年工作中的知识点做一个回顾,希望能融会贯通) (此文参考<Ja ...
随机推荐
- mongoDB在windows64上安装
1.下载64位:mongodb-win32-x86_64-enterprise-windows-64-2.6.4-signed.msi 2.安装目录:将应用安装到此目录下面:C:\MongoDB\ 3 ...
- easyui —— footer
前言: 使用easyui的datagrid,在最后一行加上“总计”字样,效果如下: 过程: ... <table id="dg" title="xx管理" ...
- 你知道js当中for循环当中的bug吗,如何解决它
本来以为for循环可以很好的解决一切问题,直到今天遇到了这段代码,刷新了我对for循环的认识,话不多说,直接上代码 var arr = [];for(var i = 0;i<10;i++) { ...
- BNU4206:单向行走
给定一个m*n的矩阵,请写一个程序计算一条从左到右走过矩阵且权和最小的路径.一条路径可以从第1列的任意位置出发,到达第n列的任意位置.每一步只能从第i列走到第i+1列的同一行或者相邻行(第一行和最后一 ...
- Linux就是这个范儿之第一次亲密接触(2)
原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处 .作者信息和本声明.否则将追究法律责 1.2 不一样的图形操作 几乎所有Linux的新用户都会认为Linux的图形界面是相当的绚丽又多彩. ...
- sql数据库中如何根据身份证号判断性别
身份证号有15位和18位的..在sql中该如何判断? I_sex ,) ,) then '男' else '女' END
- java基础---->Comparable和Comparator的使用
Comparable和Comparator都可以实现排序,今天我们就开始两种比较排序接口的学习. Comparable的使用 一.Comparable的文档说明: Lists (and arrays) ...
- Deploying Cloud Foundry on OpenStack Juno and XenServer (Part I)
link http://rabbitstack.github.io/deploying-cloud-foundry-on-openstack-juno-and-xenserver-part-i/ Cl ...
- JQuery中$.ajax()方法参数详解 转载
url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如put和 ...
- IOS中使用轻量级数据库
IOS中使用轻量级数据库 目录 概述 IOS中的轻量级数据库 sqlite的方法 数据库的实用操作 第三方类库 FMDatabase 概述 IOS中的轻量级数据库 sqlite的方法 sqlite3 ...