Throwable和Exception的区别

Java语言要求java程序中(无论是谁写的代码)所有抛出(throw)的异常都必须是从Throwable派生而来。当然,实际的Java编程中,由于JDK平台已经为我们设计好了非常丰富和完整的异常对象分类模型。因此,java程序员一般是不需要再重新定义自己的异常对象。而且即便是需要扩展自定义的异常对象,也往往会从Exception派生而来。所以,对于java程序员而言,它一般只需要在它的顶级函数中catch(Exception ex)就可以捕获出所有的异常对象。 所有异常对象的根基类是 Throwable ,Throwable从Object直接继承而来(这是java系统所强制要求的),并且它实现了 Serializable接口(这为所有的异常对象都能够轻松跨越Java组件系统做好了最充分的物质准备)。从Throwable直接派生出的异常类有Exception和Error 。Exception是java程序员所最熟悉的,它一般代表了真正实际意义上的异常对象的根基类。也即是说, Exception 和从它派生而来的所有异常都是应用程序能够catch到的,并且可以进行异常错误恢复处理的异常类型。而Error则表示Java系统中出现了一个非常严重的异常错误,并且这个错误可能是应用程序所不能恢复的,例如LinkageError ,或 ThreadDeath 等。


Error 和 RuntimeException 的子类是 unchecked 的,也就是不需要明确地 throws Error 也能编译通过。

RuntimeException 表示这种异常是否出现经常不可预料,出现了的话,就中止处理。Error 一般表示无法恢复的故障,也就是你再试一次依然会出错,比如 OutOfMemoryError,试多少次很大概率出错的。Exception 则表示一般性的异常,而且这种异常是设计中早已考虑到很常见的错误,并且一定要求在设计中说明如果处理这种异常。

RuntimException 更接近我们日常生活中的“意外”。Exception 这个更接近我们日常生活中所说的“常见错误”。Error 更像是”见鬼,看来周末国庆不加班是搞不定的“。

技术上讲,Error/RuntimeException 和 Exception 仅是 unchecked 和 checked 这种编译过程上不同,它们的主要区别还是在设计时它的重要程序及处理例程。

就好像有时候,我们在说一句话是,说成 A->B 和 B<-A 效果是不一样的,表明上它们结果相同,但是充分还是必要还是充要是不一样的,我们不能因为一个需求实现很复杂而选择了一个变通的方法的时候把这个变通说成的需求,这种混淆我在别人的代码中发现相当多这样的错误,让程序多了很多的 bug.

Throwable是java.lang包中一个专门用来处理异常的类。它有两个子类,即Error 和Exception,它们分别用来处理两组异常。 
Error用来处理程序运行环境方面的异常,比如,虚拟机错误、装载错误和连接错误,这类异常主要是和硬件有关的,而不是由程序本身抛出的。

Exception是Throwable的一个主要子类。Exception下面还有子类,其中一部分子类分别对应于Java程序运行时常常遇到的各种异常的处理,其中包括隐式异常。比如,程序中除数为0引起的错误、数组下标越界错误等,这类异常也称为运行时异常,因为它们虽然是由程序本身引起的异常,但不是程序主动抛出的,而是在程序运行中产生的。

Exception 子类下面的另一部分子类对应于Java程序中的非运行时异常的处理(在下图中将它们直接属于Exception了),这些异常也称为显式异常。它们都是在程序中用语句抛出、并且也是用语句进行捕获的,比如,文件没找到引起的异常、类没找到引起的异常等。 
一些主要子类对应的异常处理功能简要说明如下: 
ArithmeticException——由于除数为0引起的异常; 
ArrayStoreException——由于数组存储空间不够引起的异常; 
ClassCastException—一当把一个对象归为某个类,但实际上此对象并不是由这个类 创建的,也不是其子类创建的,则会引起异常; 
IllegalMonitorStateException——监控器状态出错引起的异常; 
NegativeArraySizeException—一数组长度是负数,则产生异常; 
NullPointerException—一程序试图访问一个空的数组中的元素或访问空的对象中的 方法或变量时产生异常; 
OutofMemoryException——用new语句创建对象时,如系统无法为其分配内存空 间则产生异常; 
SecurityException——由于访问了不应访问的指针,使安全性出问题而引起异常; 
IndexOutOfBoundsExcention——由于数组下标越界或字符串访问越界引起异常; 
IOException——由于文件未找到、未打开或者I/O操作不能进行而引起异常; 
ClassNotFoundException——未找到指定名字的类或接口引起异常; 
CloneNotSupportedException——一程序中的一个对象引用Object类的clone方法,但 此对象并没有连接Cloneable接口,从而引起异常; 
InterruptedException—一当一个线程处于等待状态时,另一个线程中断此线程,从 而引起异常,有关线程的内容,将在下一章讲述; 
NoSuchMethodException一所调用的方法未找到,引起异常; 
Illega1AccessExcePtion—一试图访问一个非public方法; 
StringIndexOutOfBoundsException——访问字符串序号越界,引起异常; 
ArrayIdexOutOfBoundsException—一访问数组元素下标越界,引起异常; 
NumberFormatException——字符的UTF代码数据格式有错引起异常; 
IllegalThreadException—一线程调用某个方法而所处状态不适当,引起异常; 
FileNotFoundException——未找到指定文件引起异常; 
EOFException——未完成输入操作即遇文件结束引起异常。

Error类和Exception类的父类都是throwable类,他们的区别是:

Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。

Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。

Exception类又分为运行时异常(Runtime Exception)和受检查的异常(Checked Exception ),运行时异常;ArithmaticException,IllegalArgumentException,编译能通过,但是一运行就终止了,程序不会处理运行时异常,出现这类异常,程序会终止。而受检查的异常,要么用try。。。catch捕获,要么用throws字句声明抛出,交给它的父类处理,否则编译不会通过。

错误和异常的区别(Error vs Exception) 
今天面试问了这样一个问题,"Error" 和 "Exception"之间有啥区别?我觉得挺有意思,但是似乎又不能脱口而出。查找了一番资料之后,稍微总结了一下。
1)  error都是继承自父类java.lang.Error,而exception都继承自java.lang.Exception.

2)  再看看JDK中对于java.lang.Error和java.lang.Exception的解释。
    java.lang.Error: An Error is a subclass of Throwable that indicates serious problems that a reasonable application should not try to catch. Most such errors are abnormal conditions. 即:Error是Throwable的子类,用于标记严重错误。合理的应用程序不应该去try/catch这种错误。绝大多数的错误都是非正常的,就根本不该出现的。     java.lang.Exception: The class Exception and its subclasses are a form of Throwable that indicates conditions that a reasonable application might want to catch. 即Exception 是Throwable的一种形式的子类,用于指示一种合理的程序想去catch的条件。即它仅仅是一种程序运行条件,而非严重错误,并且鼓励用户程序去catch它。

3)  Error和RuntimeException 及其子类都是未检查的异常(unchecked exceptions),而所有其他的Exception类都是检查了的异常(checked exceptions).
checked exceptions: 通常是从一个可以恢复的程序中抛出来的,并且最好能够从这种异常中使用程序恢复。比如FileNotFoundException, ParseException等。
unchecked exceptions: 通常是如果一切正常的话本不该发生的异常,但是的确发生了。比如ArrayIndexOutOfBoundException, ClassCastException等。从语言本身的角度讲,程序不该去catch这类异常,虽然能够从诸如RuntimeException这样的异常中catch并恢复,但是并不鼓励终端程序员这么做,因为完全没要必要。因为这类错误本身就是bug,应该被修复,出现此类错误时程序就应该立即停止执行。 因此,面对Errors和unchecked exceptions应该让程序自动终止执行,程序员不该做诸如try/catch这样的事情,而是应该查明原因,修改代码逻辑。

原文地址:https://www.cnblogs.com/jpfss/p/9456580.html

时间: 2024-10-17 13:15:42

Throwable和Exception的区别的相关文章

java中error和exception的区别

转载 :https://blog.csdn.net/lifengguo_njupt/article/details/7990485 java中error和exception的区别 Error类和Exception类的父类都是throwable类,他们的区别是: Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等.对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止. Exception类表示程序可以处理的异常,可

Java-异常Throwable,Exception,Error

  异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等. 异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程. Java通过API中Throwable类的众多子类描述各种不同的异常.因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件.当条件生成时,错误将引发异常. 在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出).Throwable 指定代码中可用异常传播机制通过 Java 应用程序传输的任何问题的共

Throwable和Exception

所有异常对象的根基类是 Throwable ,Throwable从Object直接继承而来(这是java系统所强制要求的),并且它实现了 Serializable接口(这为所有的异常对象都能够轻松跨越Java组件系统做好了最充分的物质准备).两个子类,Error与Exception.Exception是java程序员所最熟悉的,它一般代表了真正实际意义上的异常对象的根基类.也即是说, Exception 和从它派生而来的所有异常都是应用程序能够catch到的,并且可以进行异常错误恢复处理的异常类

Error和Exception的区别?

Error和Exception都继承自Throwable类 二者不同之处在于: Exception: 1.可以是可控制的(checked)或是不可控制的(unchecked) 2.表示一个有程序员编写的错误 3.应该在应用程序级被处理 Error 1.总是不可控的(unchecked) 2.通常用来表示系统错误,或是底层资源错误. 3.如果可能的话应该在系统级被捕获

ERROR与EXCEPTION的区别

Throwable 是所有 Java 程序中错误处理的父类 ,有两种子类: Error 和 Exception . Error :表示由 JVM 所侦测到的无法预期的错误,由于这是属于 JVM 层次的严重错误 ,导致 JVM 无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息. Exception :表示可恢复的例外,这是可捕捉到的. Java 提供了两类主要的异常 :runtime exception 和 checked exception . checked

转:Java中Error与Exception的区别

Error类和Exception类都继承自Throwable类. Error的继承关系: Exception的继承关系: 二者的不同之处: Exception: 1.可以是可被控制(checked) 或不可控制的(unchecked). 2.表示一个由程序员导致的错误. 3.应该在应用程序级被处理. Error: 1.总是不可控制的(unchecked). 2.经常用来用于表示系统错误或低层资源的错误. 3.如何可能的话,应该在系统级被捕捉. Java 中定义了两类异常: 1) Checked

RuntimeException和Exception的区别

1.java将所有的错误封装为一个对象,其根本父类为Throwable, Throwable有两个子类:Error和Exception. 2.Error是Throwable 的子类,用于指示合理的应用程序不应该试图捕获的严重问题.大多数这样的错误都是异常条件.虽然   ThreadDeath 错误是一个“正规”的条件,但它也是 Error 的子类,因为大多数应用程序都不应该试图捕获它.在执行该方法期间,无需在其 throws 子句中声明可能抛出但是未能捕获的 Error的任何子类,因为这些错误可

java中的Checked Exception和Unchecked Exception的区别

Java 定义了两种异常: - Checked exception: 继承自 Exception 类是 checked exception.代码需要处理 API 抛出的 checked exception,要么用 catch 语句,要么直接用 throws 语句抛出去. - Unchecked exception: 也称 RuntimeException,它也是继承自 Exception.但所有 RuntimeException 的子类都有个特点,就是代码不需要处理它们的异常也能通过编译,所以它

检查型异常(Checked Exception)和非检查型异常(Unchecked Exception)的区别

最近温故spring事务相关知识点,我们知道Spring的事务管理默认只对出现运行期异常(java.lang.RuntimeException及其子类)进行回滚 (至于为什么spring要这么设计:因为spring认为Checked的异常属于业务的,程序猿需要给出解决方案而不应该直接扔该框架) 这里就引出一个小的知识点,什么是Checked Exception?什么是Unchecked Exception? 其实,Java语言规范对这两个定义十分简单,将派生于Error或者RuntimeExce