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这样的事情,而是应该查明原因,修改代码逻辑。

Throwable和Exception的区别的更多相关文章

  1. error和exception的区别,RuntimeException和非RuntimeException的区别

    error和exception的区别,RuntimeException和非RuntimeException的区别   1. 异常机制       异常机制是指当程序出现错误后,程序如何处理.具体来说, ...

  2. Error与Exception的区别

    错误和异常的区别(Error vs Exception) 错误和异常的区别(Error vs Exception) 今天面试问了这样一个问题,"Error" 和 "Exc ...

  3. Error与Exception的区别,Java常见异常Execption总结

    错误和异常的区别(Error vs Exception) 错误和异常的区别(Error vs Exception) 今天面试问了这样一个问题,"Error" 和 "Exc ...

  4. Checked Exception与Runtime Exception 的区别

    Java里有个很重要的特色是Exception ,也就是说允许程序产生例外状况.而在学Java 的时候,我们也只知道Exception 的写法,却未必真能了解不同种类的Exception 的区别. 首 ...

  5. 多线程、同步实现方法及Error和Exception的区别与联系

    多线程.同步实现方法? 实现线程有两种方法: 继承Thread类 实现Runnable接口 实现同步也有两种方法 一种是用同步方法:同步方法就是在方法返回类型后面加上synchronized, 比如: ...

  6. Java 的Throwable、error、exception的区别

    1. 什么是异常? 异常本质上是程序上的错误,包括程序逻辑错误和系统错误.比如使用空的引用(NullPointerException).数组下标越界(IndexOutOfBoundsException ...

  7. Java-异常Throwable,Exception,Error

      异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等. 异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程. Java通过API中Throwable类的众多子类描述各种不同的 ...

  8. error和exception的区别

    ------解决方法--------------------------------------------------------了解异常与错误的区别,并且知道当你截获一个异常时,应该怎么办.   ...

  9. java中error和exception的区别

    转自:https://www.jianshu.com/p/e8bbee3c1c4a Error类和Exception类的父类都是throwable类,他们的区别是: Error类一般是指与虚拟机相关的 ...

随机推荐

  1. excel相关

    1.excel怎样筛选重复数据 打开Excel文件,选中待处理的数据区域,然后分别点击菜单开始--条件格式--突出显示单元格规则--重复值. 确认以Excel默认的格式突出显示重复值.之后,重复的数据 ...

  2. Update和LateUpdate的区别

    LateUpdate晚于所有Update执行 在圣典里LateUpdate被解释成一句话:LateUpdate是在所有Update函数调用后被调用.这可用于调整脚本执行顺序. 当物体在Update里移 ...

  3. ArcGIS Engine 中 Geometric Network 显示流向代码

    原文地址:http://hi.baidu.com/steeeeps/item/165fbc15475e94741009b5b3 非常感谢作者. 以前学习几何网络时,对效用网络流向进行了总结,原理与效果 ...

  4. yum报错:Error: xz compression not available

    测试服务器(centos6.5)经过一段时间的折腾,有一天在上面进行yum操作时突然出现下面的报错: Error: xz compression not available 最后经过一番排查,发现原因 ...

  5. C语言 位运算

    1G=1024M; 1M=102KB; 1KB=1024B(字节); 1B=8bits(位); #include<stdio.h> #include<stdlib.h> //C ...

  6. Spring中Bean的命名问题(id和name区别)及ref和idref之间的区别

    Spring中Bean的命名 1.每个Bean可以有一个id属性,并可以根据该id在IoC容器中查找该Bean,该id属性值必须在IoC容器中唯一: 2.可以不指定id属性,只指定全限定类名,如: & ...

  7. git流程及操作

    一.git认识 git是什么?Git是目前世界上最先进的分布式版本控制系统 二.git安装 三.git创建本地库 1.首先选择e盘新建一个文件夹如douban 2.点击鼠标右键,执行Git Bash ...

  8. ZooKeeper学习第五期--ZooKeeper管理分布式环境中的数据

    引言 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它涉及到了paxos算法.Zab协议.通信协议等相关知识,理解起来比较抽象所以还需要借助一些应用场景,来帮我们 ...

  9. [vim]的关键字补全

    除了complete关键字补全,所有补全相关命令都以CTRL-X开始,然后再接与补全类型相关的命令.CTRL-N与CTRL-P在找的的内容中选择的通用的命令,上下选择用的,CTRL-E则是取消选择.( ...

  10. Fedora 12 环境搭建

    又来折腾发行版了. 这一回是Fedora12,搞的挺艰难的 下载了Fedora-12-i386-DVD.iso,无论使用ultraiso还是dd都无法安装. 后来下载了一个ImageWriter.ex ...