java面试题(杨晓峰)---第二讲Exception和Error有什么区别?
本人总结:
Exception和Error:正常问题和意外问题,以自行车举例:没气和爆胎.
①理解Throwable,Exception,Error的设计和分类.
②掌握哪些应用最广泛的子类,
③如何定义异常.
解决不了异常的捕获不如抛出.
捕获不了异常的捕获不是好捕获,什么异常都捕获的捕获不是好捕获,解决不了异常的捕获一定是坏捕获.
捕获不是俄罗斯转盘,99分的捕获不如抛出,因为缺的1分可能是致命的.
世界上存在永远不会出错的程序吗?这也许只会出现在程序员的梦中.随着编程语言和软件的诞生,异常情况就如影随形的纠缠着我们,只有正确吃力好意外情况,才能保证程序的可靠性.
java语言在设计之初就提供了相对完整的异常处理机制,这也是java得意大行其道的原因之一,因为这种机制大大降低了编写和维护可靠程序的门槛.如今,异常处理机制已经成为现代编程语言的标配.
今天的问题:
请对比Exception和Error,另外,运行时异常与一般异常有什么区别?
经典回答
Exception和Error都是继承了Throwable类,在java中只有Throwable类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型.
Exception和Error体现了java平台设计者对不同异常情况的分类.
Exception是程序正常执行中,可以预料的意外情况,应该被捕获,进行相应处理.
Error是指正常情况下,不大可能出现的情况.绝大部分的Error都会导致程序(比如JVM自身)处于非正常,不可恢复状态.既然是非正常状态因此也不便于,不需要捕获,常见如:outofmemoryerror等Error子类.
exception分为:可检查异常和不检查异常.
可检查异常:在源代码中必须显示的进行捕获处理,这是编译期检查的一部分.
不检查异常:(运行时异常):例如空值越界.通常是通过编码可以避免的逻辑错误,根据具体需求判断是否捕获,并不会在编译期强制要求.
考点分析:
分析Exception和Error的区别,从概念角度考察了java处理机制,总的来说,还处于理解的层面,面试者只要解释清楚就好.
我们在日常编程中,如何处理好异常是比较考验功底的,我觉得需要掌握两个方面
第一,理解Throwable,Exception,Error的设计和分类.比如,掌握哪些应用最广泛的子类,以及如何定义异常.
很多面试官会进一步追问一些细节,比如,你了解哪些Exception,Error,RunTimeException?我简单画了一个图以供参考.
重点理解NoClassDefFoundError和ClassNotFoundException有什么区别,也是经典的入门题目.
第二,理解java语言中操作Throwable的元素和实践.要掌握最基本的语法.如try-catch-finally块,throw,throws关键字等.同时,懂得解决经典场景问题.
异常处理代码比较繁琐,如要写千篇一律的捕获代码,或在finally做一些资源回收工作.随着java语言的发展引入一些更便利的特征,比如 try-with-resources和multiple catch,在编译时期会自动生成对应的处理逻辑.例如,自动按约定俗成close哪些拓展了AutoCloseable或者Closeable的对象.
知识拓展
前面谈的大多数是概念性的知识,下面谈谈实践中的选择,我会结合带吗进行分析.
第一个:下面代码反应异常处理中哪些不当之处:
try{
//业务代码
Thread.sleep(1000L)
}catch(Exception e){
//lgnore it
}
这段代码很短,但违反了两个基本原则
第一:尽量不要捕获Exception这样的通用异常,而是要捕获特定异常,其中Thread.sleep()抛出InterruotedException.
这是因为在日常的开发和合作中,我们读代码的机会往往超过写代码.软件工程是一门协作的艺术,所以我们有义务让自己的代码直观体现尽量多的信息,但是泛泛的Exception之类,恰恰隐藏了我们的目的.另外,我们需要保证程序不会捕获我们不希望的异常.比如我们希望RuntimeException被扩散出去,而不是被捕获.更进一步讲,除非经过深思熟虑,否则不要捕获Throwable或者Error,因为很难保证正确处理OutOfMemoryError
第二,不要生吞异常,就是没有完整解决异常.catch里的内容没有解决try抛出的问题.这样可能导致难以诊断的诡异情况.
生吞异常,基于假设这个异常不会发生,或者觉得忽略异常是无所谓的,但是千万不要在产品代码做这种假设.
如果我们不把异常抛出来,或者也没有输出到日志之类,程序可能在后续代码以不可控方式结束.没人可以判断究竟哪里抛出异常,以及什么原因导致异常.
第二个:
try{
//业务
}catch(IOException e){
e.printStackTrace();
}
这段代码作为一段实验代码没有任何问题,但在产品代码中通常不允许这样处理.因为标准出错(STERR)不是一个合适的输出选项,因为很难判断出到底输出到哪里去了.
公众号:代码荣耀
在java世界里,异常的出现让我们编写的程序运行起来更加健壮,同时为程序在调试,运行期间发生的一些意外情况,提供补救机会,即使遇到一些严重错误而无法补救,异常也会非常忠实的记录所发生的一切,
①不要推诿或延迟异常处理,就地解决最好,并且要进行实实在在的处理,而不是只是捕捉不做动作,
②一个函数尽管抛出了多个异常,但是只有一个异常可被传播到客户端,最后被抛出的异常是唯一被调用端接收的异常,其他异常会被忽略,如果调用端要知道造成失败的最初原因,程序之中就不能掩盖任何异常.
③不要在finally代码块中处理返回值.
④按照我们程序员的惯性认知:当遇到return语句的时候,执行函数会立刻返回.但是,在java语言中,如果存在finally就会有例外,除了return语句,try代码块的break或continue语句也可能使控制权进入finally代码块.
⑤请勿在try代码块中调用return,break,continue语句.万一无法避免,一定要确保finally的存在不会改变函数的返回值.
⑥函数返回值有两种类型:值类型与对象引用。对于对象引用要特别小心,如果在finally代码块中对函数返回的对象成员属性进行修改,即使不在finally块中显式调用return语句,这个修改也作用于返回值上,
⑦误将异常用于控制流。
⑧如无必要,勿用异常。
java面试题(杨晓峰)---第二讲Exception和Error有什么区别?的更多相关文章
- java面试题(杨晓峰)---第一讲谈谈你对java平台的理解
本人总结: 面向对象(封装,继承,多态) 平台无关性(jvm运行,class文件) 语言(泛型,lambda) 类库(集合,并发,网络,io/nio) jre(java运行环境,JVM,类库) JDK ...
- java面试题(杨晓峰)---以面试题为切入点,有效提升你的java内功
java是一门历史悠久的编程语言,可以毫无争议的说,java是最主流的编程语言之一.全球有1200万以上的java程序猿以及海量的设备,还有无所不能的java生态圈. 我所知道的诸如阿里,京东,百度, ...
- java面试题(杨晓峰)---第七讲谈谈int和integer有什么区别?
理解装箱和拆箱的过程. 对象由三部分组成:对象头,对象实例,对齐填充. 对象头:一般是十六个字节,分两部分,第一部分:哈希码,锁状态标志,线程持有的锁,偏向线程id,gc分代年龄等,第二部分是类型指针 ...
- java面试题(杨晓峰)---第六讲谈谈动态代理是基于什么原理?
我在编译时不知道,而在运行时知道,那么肯定在运行时给了提示,这个提示就是额外功.好处是可以重复利用相同代码. 代理模式:通过代理静默的解决一些与业务无关的问题,例如远程,安全,事物,日志,资源关闭,. ...
- java面试题(杨晓峰)---第四讲强引用、软引用、弱引用、幻想引用有什么区别?
在java语言中,除了原始数据类型的变量,其他所有都是所谓的引用类型,指向各种不同的对象,理解引用对于掌握java对象生命周期和JVM内部相关机制非常有帮助. 今天问题:强引用.软引用.弱引用.幻想引 ...
- java面试题(杨晓峰)---第八讲谈谈Vector,ArrayList,LinkedList有何区别?
Vector,ArrayList,LinkedList均为线性的数据结构,但是从现实方式与应用场景中又存在差别. 1 底层实现方式 ArrayList内部数组来实现,LinkedList内部采用双向链 ...
- java面试题(杨晓峰)---第五讲String、StringBuffer、StringBuilder有什么区别?
线程 字符 操作频繁度 1 String (1)String的创建机制 由于String在java世界中使用过于频繁,java为了避免在一个系统中产生大量重复的String对象,引入了字符串常量池,其 ...
- java面试题(杨晓峰)---第三讲谈谈final、finally、finalize有什么不同?
java语言有很多看起来相似,但用途却完全不相同的语言要素,这些内容往往容易成为面试官考察你知识掌握程度的切入点. 今天我要问你一个基础的java经典题目,谈谈final.finally.finali ...
- Java核心技术36讲----------Exception和Error有什么区别
1.异常知识点学习实例 代码如下: package fromnet; /** * 参考链接:https://blog.csdn.net/qq_18505715/article/details/7319 ...
随机推荐
- 一个.NET通用JSON解析/构建类的实…
一个.NET通用JSON解析/构建类的实现(c#) 在.NET Framework 3.5中已经提供了一个JSON对象的序列化工具,但是他是强类型的,必须先按JSON对象的格式定义一个类型,并将类型加 ...
- 符号分割的字符串转换为XML
把某一符串分割的字符串转换为 XML格式: DECLARE @str NVARCHAR(MAX) = N'fd,re,45,tyu,976,qwer,gdsg,uyt' DECLARE @xml XM ...
- PostgreSQL 务实应用(五/5)常用表达
在实际应用中,对于具体的数据计算我们会找相应的函数来实现.而计算需求不同的表达,往往会使得我们使用不同的函数或方式来实现.或者也可以说,同一计算可以使用多种不同的表达方式实现. PostgreSQL ...
- Git 时光穿梭鸡 删除文件 以及批量删除文件
先添加一个新文件test.txt到Git并且提交: 一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了 $ rm test.txt 这个时候,Git知道你删除了文件, 因此,工作 ...
- python 之 列表生成式、生成器表达式、模块导入
5.16 列表生成式 l=[]for i in range(100): l.append('egg%s' %i)print(l)l=['egg%s' %i for i in range(100 ...
- Java Servlet图片上传至指定文件夹并显示图片
在学习Servlet过程中,针对图片上传做了一个Demo,实现的功能是:在a页面上传图片,点击提交后,将图片保存到服务器指定路径(D:/image):跳转到b页面,b页面读取展示绝对路径(D:/ima ...
- 长春理工大学第十四届程序设计竞赛(重现赛)L.Homework Stream
链接:https://ac.nowcoder.com/acm/contest/912/L 题意: 作为大珩班尖子生,小r每天有很多作业要完成,例如工图.工图和工图. 很显然,做作业是要有顺序的.作业之 ...
- HDU-1498-50years,50colors(最大匹配, 枚举)
链接:https://vjudge.net/problem/HDU-1498#author=634579757 题意: 撞气球游戏,一个n*n的矩阵中,有不同颜色的气球,气球的颜色最多50种(从1到5 ...
- UVaLive6435(dp)
要点 题意:两个数据传输数列,每个数列里有若干个数据包并给出发出时间\(t\),每个数据包到达的时间\(T\)是\(t <= T < t + D\),问有多少种到达序列. 将题目转化为第二 ...
- Codeforces Round #431 (Div. 2) C
From beginning till end, this message has been waiting to be conveyed. For a given unordered multise ...