一、异常体系
什么是异常?
异常就是程序中的一些错误,但并不是所有的错误都是异常
例如:输入了非法程序/打开了不存在的文件/网络通信时连接中断/JVM内存溢出/OOM等
这些异常大多数是我们开发人员出错误所引起的,还有一部分错误是我们程序本身引起的
异常分类
1.error(错误) / Exception(异常)
error:表示我们程序当中无法处理的错误( OOM / 线程写成死亡导致的错误) 一般发生error错误的时候,JVM虚拟机会选择线程终止
Exception的(运行时异常/非运行时异常):表示程序本身可以处理的异常
2.运行时异常和非运行时异常
运行时异常:大多数分为RunTimeException以及它的子类(空指针异常/数组下标越界异常) 这些异常是不检查的异常,可以选择try/catch 也可以选择不处理
非运行时异常:除了我们运行时异常以外的异常都是非运行时异常(IOException/SQLException/自定义的一些Exception.从程序语法角度上说是必须处理的异常.如果不处理程序是编译不通过的.
在Java当中我们是把异常当作对象来处理的,定义了一个基类,是所有异常的超类.
二、异常使用
1.运用Java异常处理机制
1)try....catch语句(表示在try代码块中抛出异常之后,立即会转到catch代码块中执行或者退到栈的上一次代码中去寻找catch代码块)
2)finally语句:任何情况下都必须执行的代码(由于异常会强制中断正常流程. finally语句的执行都是在try....catch语句后面,这样也保证了这样的操作会被执行.[缺点:由于finally和try...catch代码块是相互孤立开的,所以程序结构比较松散,可读性比较差,影响程序的建造性])
3)throws子句:声明可能会出现的异常(只能在方法声明处)
4)throw语句:抛出异常(可以在各个地方都可以抛出异常)
2.异常处理的原理
1)Java虚拟机用方法调用栈(method invovation)来跟踪每个线程中一系列的方法调用过程.
2)如果执行方法中抛出异常,则Java虚拟机必须找到能捕获该异常的catch代码块
3)当Java虚拟机追溯刀调用栈的底部方法时,如果仍然没有找到处理该异常的代码块
3.异常流程的运行过程
1)finally语句不被执行的唯一情况就是先执行了用于终止程序的System.exit()方法
2)return语句用于退出本方法
3)finally代码块虽然在return语句之前就被执行但是变量修改不会影响我们的返回值
4)建议不要再finally代码块中使用return语句
第一种场景代码
第二种场景代码 第三种场景代码
第四种场景代码
三、一些异常得面试题
1.Java中的检查异常和非检查异常有什么区别?
可检查异常:经编译器验证,对于声明抛出异常的方法.编译器将强制执行处理并声明规则.
非检查异常(error):不遵循处理和声明规则.在产生子类异常时,不一定要采取任何适当操作.编译器不会去走是否解决了这样的异常
2.throw 和 throws 这两个关键字在java中有什么不同?
throw:总是出现在函数体内.在程序运行中抛出的一个拒绝的异常Expection,它抛出的Expection需要我们的代码人员来捕获处理
throws:总是出现在函数头当中.声明方法抛出的所有异常表示这个方法不能处理所有通过sevrice这个方法来抛出异常
3.如果执行finall代码块之前方法放回了结果,或者JVM退出了,finally块中俄代码还会执行吗?
1)在try代码块之外异常或者放回不是执行finally代码块的
2)在执行try代码块时退出JVM虚拟机
3)在子线程中执行try代码块时突然退出线程
4.Java中final,finalize,finally关键字的区别?
final:被修饰的类,不能被继承,方法不能重写,变量变成常量,
finally:用于异常处理,执行清除操作。
finanlize:在垃圾收集器删除,对象之前调用此方法
网友评论