java异常—检查异常(checked exception)和未检查异常(unchecked exception)

来源:互联网 发布:龙卷风优化软件刷排名 编辑:程序博客网 时间:2024/05/29 12:36

网易面试要我画异常的结构图,什么是检查异常,什么是非检查异常,我当时的表情是这样的,。我看过,忘了。没办法,继续看,写博客掌握。

先来看看异常的结构图,建议你结合JDK一起看。

 

 


 

可以看出异常的家族势力庞大,通常我们说的异常是包括exceptio和error。

 

Exception家族我们恐怕见的不少,但是error家族我们可能就没什么印象了,下面我来说说这两个类的区别:

Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。大多数的错误与代码编写者执行的操作无关,而是表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在 Java中,错误通过Error的子类描述。

个人理解:出现Error错误一般不是由于你编写的代码出现问题,而是由于JVM运行你这段代码出现了问题,比如堆溢出,配置文件出错等,这些你是无法人为的在你代码里可以保证的,必须要额外的去操作,重新配置虚拟机,修改配置文件等等。

Exception(异常):是程序本身可以处理的异常。也就是你常见的空指针异常(NullPointerException),数组超出范围异常(IndexOutOfBoundsException)等等。

 

通常,Java的异常(包括Exception和Error)分为检查异常(checked exceptions)和非检查的异常(unchecked exceptions)。

 

一、检查异常(checked exceptions)

什么是检查异常?

答:就是编译器要求你必须处置的异常。不知道你编程的时候有没有遇到过,你写的某段代码,编译器要求你必须要对这段代码try...catch,或者throws exception,如果你遇见过,没错,这就是检查异常,也就是说,你代码还没运行呢,编译器就会检查你的代码,会不会出现异常,要求你对可能出现的异常必须做出相应的处理。

对检查异常(checked exception)的几种处理方式:
1、继续抛出,消极的方法,一直可以抛到java虚拟机来处理,就是通过throws exception抛出。
2、用try...catch捕获
注意,对于检查的异常必须处理,或者必须捕获或者必须抛出

 

如何区分什么是检查异常呢?

除了RuntimeException与其子类,以及错误(Error),其他的都是检查异常(绝对的大家族)。

 

二、非检查异常(unchecked exceptions)

什么是非检查异常?

答:编译器不要求强制处置的异常,虽然你有可能出现错误,但是我不会在编译的时候检查,没必要,也不可能。为什么呢?你想想非检查异常都有哪些?NullPointerException,IndexOutOfBoundsException,VirtualMachineError等,这些异常你编译的时候检查吗?那我还要不要运行了,等死人啊。再说了,明明可以运行时检查,都在编译的时候检查,你写的代码还能看吗?而且有些异常只能在运行时才能检查出来,比如空指针,堆溢出等。

对未检查的异常(unchecked exception )的几种处理方式:
1、捕获
2、继续抛出
3、不处理

一般我们是不处理的,因为你很难判断会出什么问题,而且有些异常你也无法运行时处理,比如空指针,需要人手动的去查找。

而且,捕捉异常并处理的代价远远大于直接抛出。

 

如何区分什么是非检查异常呢?

RuntimeException与其子类,以及错误(Error)。

 

顺便说一下运行时异常和非运行时异常。

刚才我们是从Exception和Error整体来划分的,现在我们可以对Exception异常进行划分,它可分为运行时异常和非运行时异常。

一、运行时异常

都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是非检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。

二、非运行时异常

是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不要自定义检查异常。

 

参考文献:

深入理解java异常处理机制

检查异常和未检查异常不同之处

阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 打开手机浏览器为什么是英文怎么办 ie浏览器删除掉了怎么办 手机360浏览器卸载不掉怎么办 大学素质拓展学分不够怎么办 专升本学分不够怎么办 电脑连接无线网络网关禁用怎么办 背部毛孔粗大有黑头怎么办 毛孔变粗大长痘怎么办 皮肤粗糙暗黄毛孔大怎么办 毛孔粗大还有痘印怎么办 高一的不爱上数学怎么办 监狱系统需要体测怀孕怎么办 货运从业资格证年审过期了怎么办 科三线路记不住怎么办? 汽车大灯里面起雾水怎么办 二级重伤对方法庭拒绝赔偿怎么办? 在麦当劳工作收到假钞怎么办 东西湖小学分配太远怎么办 农行k令过期了怎么办 穿军训的鞋捂坏了怎么办 联通手机号销户话费怎么办 建行员工所持有的原始股怎么办 孕妇喝了午时茶怎么办 苹果6id被锁了怎么办 苹果手机app密码忘了怎么办 好哥们借钱手上没钱怎么办 武汉ca证书u盾怎么办 判了刑发现还有漏案没判怎么办 高铁旅客漏乘怎么办 水库里面要养殖小龙虾最好怎么办 点读机的笔丢了怎么办 皮肤晒的很黑怎么办 电脑wifi连接受限制怎么办 高中孩子班管理松怎么办 脱式计算有余数怎么办 手机被别人绑定微信怎么办 饿了么入职查不到学历怎么办 高中没考上家人让打工怎么办 一建证书丢了怎么办 自考大专证书丢了怎么办 护士学分卡丢了怎么办