java语言中error和exception有啥区别?final和finally有啥区别?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java语言中error和exception有啥区别?final和finally有啥区别?相关的知识,希望对你有一定的参考价值。
error通常指错误,已经超出了异常的范畴,如:典型的error有内存溢出,这种错误你是无法通过通过程序来控制和更正的。而Exception则是指由于程序员的疏忽导致程序在运行时出现了非正常的状态,这种异常通常时是由于程序员的逻辑问题或者疏忽大意造成的,但是程序员同样可以通过程序代码来进行修复和改正。只要程序员认真全面的检查。程序中的异常可以被避免。两者的主要区别也就是一个可以由程序来控制修复,而error则很难修复或者不受程序员控制的错误。至于final是Java中的访问修饰符,一个类被声明为final,则意味着这个类不能被继承,不能有子类,一个方法被声明称final则该方法不能被重写,一个变量被声明为final则该变量在运行时无法动态更改变量的值。而finally则是异常处理语句块的一部分。通常在捕获异常后会执行该语句块中的内容(如果有的话)。比如可以在该语句块中来执行数据连接关闭的操作。说的很清楚了,有不明白的地方再问吧!~ 参考技术A error:已经报错。Exception:是预计会报错,可以在报错时对该错误进行相应的处理,以便程序进行执行。final:是定义常量。定义后不能修改,定义时必须赋值。finally:是trycatchfinally语句块中最后一块,表示:无论trycatch里是否会执行出错,最后都必须执行finally里的代码。通常finally里放return值。 参考技术B error是出错误来了,你想挽回也不行了.exception是你觉得某处可能会出错误 然后你加上一个保险,如果出现了错误就用你的这个保险去处理 final是用来定义一个变量用的而finally是用在方法里的最后,表示不管出什么问题或者不出问题 都会执行finally里面的代码final和finally有本质的区别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语言中error和exception有啥区别?final和finally有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
java中错误(error)和异常(exception)有啥主要区别?
Java 中 给一个object 赋值属性, 既可以用构造函数的方式,也可以用setXXXX()的方式,而它们之间有啥区
Java中Error和Exception的异同以及运行时异常(Runtime exception)与检查型异常(checked exception)的区别