异常
1.异常,异于平常。在Java中,阻止当前方法或作用域的情况就被称为异常。
2.异常并非都是错误,而同样的错误也并非都是异常,有些错误有时候是可以避免的。
3.异常出现的原因:
(1):用户输入了非法数据;
(2):所要打开的文件其实本身就不存在;
(3):网络通讯时连接中断,或者JVM内存溢出。
4.有些异常时由用户错误引起的,有些是程序错误引起的,还有一些是因为物理错误引起的。
5.异常发生时期的主要分类:运行期异常、编译期异常
6.Java异常机制:
(1):Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。Java中的异常主要分为两大类:错误Error和异常Exception.
(2):Throwable类是所有异常或错误的超类,他有两个子类:Error和Exception,分别代表错误和异常。
(3):错误一般指Java虚拟机相关的的问题,如系统奔溃、虚拟机出错误、动态链接失败等,这些错误无法恢复或不可捕捉,将导致引用程序中断,通常程序无法处理这些错误,因此应用程序不应该捕获Error对象,也无需在其throws子句中声明该方法抛出任何Error或其子类。
7.可查异常和不可察异常
(1):可查异常:编译器要求必须处理的异常
(2):不可查异常:编译器不要求强制处理的异常,包括运行期异常和错误。
运行期异常
1.由系统检测,用户的Java程序中可以不做处理,系统将它们交给缺省的异常处理程序。
2.运行期异常常出现的情况:
(1):类型转换错误;
(2):数组访问越界;
(3):空指针的访问;
(4):算数异常
3.如果出现的是运行期异常,一定就是用户的错误。
4.出现运行期异常后,如果没有捕获处理这个异常,系统就会把异常一直往上抛,一直到最上层,如果是多线程就由thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。
5.运行期异常时Exception的子类,也有一般异常的特点,是可以被catch块处理的。只不过往往我们不对它做处理罢了。也就是说,如果不对运行期异常进行处理,那么运行时异常之后,要么线程终止,要么是主程序终止。如果不想终止,则必须捕获所有的运行期异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃。
编译期异常
1.是需要显示用try{}catch{}捕捉处理的异常,如 IOException等;
编译期异常&运行期异常的区别和原则
1.区别:
(1):运行期异常:调用代码不能继续执行,需要立即终止。
(2):非运行期异常:调用代码需要进一步处理和恢复。
2.原则:
(1):非运行期异常是强迫使用者处理联动的操作,如sql执行失败需要关闭连接、回滚事务。此类异常若自己可以把关联处理掉则可转运行时异常。
(2):运行时异常用于程序运行的检验、如:前置条件校验、后置条件检验。
(3):运行时异常常用于运行的必要条件不具备时阻断程序运行,如:连接服务器失败。
(4):业务异常一般是条件检验的异常,基本用运行时异常声明。
(5):系统在设计时,一般用检验异常标注可能存在的异常,用于告知开发者。
(6):工具类中一般之间抛出原始的非运行时异常。
异常的捕捉
1.代码块:
try{//一些会抛出的异常
}catch(Exception e){//第一个catch,处理该异常的代码块
}catch(Exception e){//第二个catch,可以有多个catch,处理该异常的代码块
}finally{//最终要执行的代码
}
2.try代码块:
try模块捕捉异常时为了选定捕获异常的范围,将所有可能抛出异常的语句都放入try模块中,每个try代码块可以有一个或多个catch语句,用来处理try代码块中所生成的异常事件。
3.catch代码块:
catch语句只需要一个形式参数指明它所能够捕捉的异常类型,这个类必须是Throw able的子类,运行时系统可以通过参数值把被抛出的异常的对象传递给catch块。在catch块中对异常对象进行处理的代码。类Throw able还提供了方法printStackTrace()用来跟踪异常事件发生时执行堆栈的内容。
4.捕捉异常的顺序和catch语句的顺序有关,当捕捉到一个异常时,剩下的catch语句就不再进行匹配。因此,在安排catch语句的顺序时,首先应该捕捉最特殊的异常,然后再逐一一般化,也就是一般先安排子类,再安排父类。
5.finally:
finally这个在代码当中可有可无。捕获异常的最后一步就是通过finally语句异常处理提供一个统一的出口,使得在控制流转到程序的其他部分以前,能够对程序的状态作统一的管理。不论在try代码块中是否发生了异常事件,finally块的语句都会被执行。
6.注意事项
(1):catch不能独立于try存在。
(2):在try{}catch{}后面添加finally块并非强制性要求的。
(3):try代码后不能既没有catch块也没有finally块。
(4):try,catch,finally块之间不能添加任何代码。
异常的抛出
1.抛异常的关键字:throws,throw
2.在Java程序的执行过程中,如果出现了异常事件,就会生成一个异常对象。生成的异常对象将传递给Java运行时系统,这一异常的产生和提交过程称为抛出异常。
3.如果一个方法没有捕获到一个检查性异常,那么该方法必须使用throws关键字来声明throws关键字放在方法签名的尾部,也可以使用throw关键字抛出一个异常。
4.一个方法可以声明抛出多个异常,多个异常之间用“,”隔开。
(1):一个方法不处理,而是沿着调用层次向上传递,由调用它的方法来处理这些异常,叫声明抛出异常(throws)。声明抛出异常是一种消极的异常处理机制。
(2):抛出异常就是产生异常对象的过程,首先要生成异常对象,异常或者由虚拟机生成,或者由某些类的实例生成,也可以在程序中生成,在方法中,抛出异常对象通过throw语句实现。
(3):可以抛出的异常必须是Throw able或者其子类的实例。
(4):throw able或者Exception类,建议使用Exception类。用户定义的异常类同样要用try{}catch{}捕获,但必须由用户自己抛出throw new MyException()。
用户自定义异常
1.所有异常都必须是Throw able的子类;
2.如果希望写一个编译期异常类,则需要继承Exception类;
3.如果希望写一个运行期异常类,那么需要继承RunntimeException.
4.自定义自己的异常类
class MyException exception Exception{};
只继承exception类来创建的异常类是编译期异常类。