java中错误(error)和异常(exception)有啥主要区别?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中错误(error)和异常(exception)有啥主要区别?相关的知识,希望对你有一定的参考价值。
1.如图Exception 和 Error都继承自Throwable类,由jdk api文档中对该类的描述可以知道它是异常处理机制的基本组成类型。可以由虚拟机抛出或者编码者自行抛出(throw)
jdk8中文发翻译Throwable类的描述:Throwable类是Java语言中所有错误和异常的Throwable类。 只有作为此类(或其一个子类)的实例的对象由Java虚拟机抛出,或者可以由Java throw语句抛出。 类似地,只有这个类或其子类可以是catch子句中的参数类型。
2.Exception 和 Error 体现了 Java 平台设计者对不同异常情况的分类。Exception 是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。
3.Error 是指在正常情况下,不大可能出现的情况,绝大部分的 Error 都会导致程序(比如 JVM 自身)处于非正常的、不可恢复状态。既然是非正常情况,所以不便于也不需要捕获,常见的比如 OutOfMemoryError 之类,都是 Error 的子类。
4.Exception 又分为可检查(checked)异常和不检查(unchecked)异常,可检查异常在源代码里必须显式地进行捕获处理,这是编译期检查的一部分。前面我介绍的不可查的 Error,是 Throwable 不是 Exception。
如何处理这些异常?
在现实编程中我们一般使用 try-with-resources 和 multiple catch来进行一些异常处理(便利的特性),在编译时期,会自动生成相应的处理逻辑,比如,自动按照约定俗成 close 那些扩展了 AutoCloseable 或者 Closeable 的对象。
try-with-resources 是一种处理Closeable实现类关闭资源的一种写法,简单写了一个例子可以发现其实这就是一中语法,这种语法可以自动编译帮忙编译最后关闭流的操作:
public static void main(String[] args)
try (BufferedReader br = new BufferedReader(new FileReader("a"));
BufferedWriter writer = new BufferedWriter(new FileWriter("a")))
// Try-with-resources
catch (IOException e) // Multiple catch
// Handle it
编译后class
public static void main(String[] args) try
BufferedReader br = new BufferedReader(new FileReader("a"));
Throwable var2 = null; try
BufferedWriter writer = new BufferedWriter(new FileWriter("a"));
Object var4 = null; if (writer != null) if (var4 != null) try
writer.close();
catch (Throwable var15)
((Throwable)var4).addSuppressed(var15);
else
writer.close();
catch (Throwable var16)
var2 = var16; throw var16;
finally if (br != null) if (var2 != null) try
br.close();
catch (Throwable var14)
var2.addSuppressed(var14);
else
br.close();
catch (IOException var18)
;
异常处理的两个基本原则
尽量不要捕获类似 Exception 这样的通用异常,而是应该捕获特定异常
这是因为在日常的开发和合作中,我们读代码的机会往往超过写代码,软件工程是门协作的艺术,所以我们有义务让自己的代码能够直观地体现出尽量多的信息,而泛泛的 Exception 之类,恰恰隐藏了我们的目的。另外,我们也要保证程序不会捕获到我们不希望捕获的异常。比如,你可能更希望 RuntimeException 被扩散出来,而不是被捕获。
不要生吞(swallow)异常。这是异常处理中要特别注意的事情,因为很可能会导致非常难以诊断的诡异情况。
如果我们不把异常抛出来,或者也没有输出到日志(Logger)之类,程序可能在后续代码以不可控的方式结束。没人能够轻易判断究竟是哪里抛出了异常,以及是什么原因产生了异常。
在写程序时可以通过Objects类(jdk提供),或者断言等提前判断问题,如空指针异常的一些值的处理Objects. requireNonNull(filename);而不是使用之后有问题再系统抛出异常,这可能就会不直观的找到问题所在。即:Throw early, catch late 原则
希望对您有所帮助!~
Exception(违例)表示需要捕捉或者需要程序进行处理的异常,它处理的是因为程序设计的瑕疵而引起的问题或者在外的输入等引起的一般性问题,是程序必须处理的。
Exception又分为运行时异常,受检查异常。
运行时异常,表示无法让程序恢复的异常,导致的原因通常是因为执行了错误的操作,建议终止程序,因此,编译器不检查这些异常。
受检查异常,是表示程序可以处理的异常,也即表示程序可以修复(由程序自己接受异常并且做出处理), 所以称之为受检查异常。 参考技术B
Error
表示仅靠程序本身无法恢复的严重错误,比如说内存溢出、动态链接异常、虚拟机错误。应用程序不应该抛出这种类型的对象。假如出现这种错误,除了尽力使程序安全退出外,在其他方面是无能为力的。所以在进行程序设计时,应该更关注Exception类。
Exception
由Java应用程序抛出和处理的非严重错误,比如所需文件没有找到、零作除数,数组下标越界等。它的各种不同子类分别对应不同类型异常。
Exception可分为两类:CheckedException 和 RuntimeException
Java异常机制
- Java把异常作为一种类,当做对象来处理。所有异常类的基类是Throwable类。两大子类分别是Error和Exception。这些异常类可以分为三种类型:错误、受检异常、运行时异常。
- 错误由JVM抛出,用Error类表示。Error类描述的是内部的系统错误,例如Java虚拟机崩溃、内存溢出等。这种情况仅凭程序自身是无法处理的,在程序中也不会对Error异常进行捕捉和抛出。
- 异常(Exception)又分为RuntimeException(运行时异常)和CheckedException(受检异常),两者区别如下:
- RuntimeException:程序运行过程中才出现和被检查出来的错误。例如:类型错误转换,数组下标访问越界,空指针异常、找不到指定类等等。
- CheckedException:来自于Exception且非运行时异常都是检查异常,编译器会强制检查并通过try-catch块来对其捕获,或者在方法头声明该异常进一步交给调用者处理。
- 两种异常的处理方式:若是运行时异常,则表明程序出错,应该找到错误并修改,而不是对其捕获。若是检查异常,遵循该原则:谁知情谁处理,谁负责谁处理,谁导致谁处理。处理就是对其先捕获后做具体的本地化处理。
以上是关于java中错误(error)和异常(exception)有啥主要区别?的主要内容,如果未能解决你的问题,请参考以下文章
Error creating bean with name xxx Factory method ‘sqlSessionFactory‘ threw exception; nested excepti
java中错误(error)和异常(exception)有啥主要区别?