java 异常总结

### 为什么要处理异常
    1.1 异常的简介。
        程序在运行过程中,没有按照程序员期望的方式正常执行,出现不可预知的、非期望的情况叫异常。
    1.2 为什么要处理异常。
        1> 程序出现异常情况影响用户体验(小到用户体验差"错误输出给客户,Java.alng.NullPointerException什么鬼???",大到"程序使用者没发使用")
        2> 对于开发人员:小到程序出现异常并不影响主流程,知识在小细节上出现问题(空指针),大到死锁系统崩溃duang掉。
        3> 对异常正确的使用是代码优雅、健壮、安全性的提现。
        4> 一个螺丝有着影响全局的潜力。


### java异常的结构
    2.1 异常的结构体系。
    
    2.2 异常体系的介绍
        1> Throwable:所有java异常的根父类。Throwable有两个子类Error和Exception。Error和Exception各自有大量的子类。
        2> Error:程序运行时,JVM出现错误,开发者无法通过代码来处理。一旦出现Error,程序彻底挂掉,通常称之为"程序终结者"。比如熟悉的"OutOfMemoryError",由于程序没有可以再使用的内存导致内存溢出,系统挂掉。一般程序中不应该抛出Error类的异常。
        3> Exception:程序在运行过程中发送不被期望的事件,应用层面最顶层异常类,程序本身可以处理的异常。异常处理的核心。
        4> 检查异常(checked Exception):在项目编译的时候就会报错,无法通过编译。需要立马解决的异常。注:Java中并没有一个名为Checked Exception的类。该异常我们必须手动在代码里添加捕获语句来处理该异常。
        5> 非检查异常(unchecked Exception): RunTimeException 和 Error异常是非检查异常。代码在运行的时候可能出现异常,但是不会在编译的时候报错。注:Java中并没有一个名为UnChecked Exception的类。

### 异常的处理     3.1 异常的处理机制         1> 在 Java 应用程序中,异常处理机制为:抛出异常,捕捉异常,处理异常。         2> 在整个Java的异常处理中,实际上也是按照面向对象的方式进行处理的,处理步骤:          1. 一旦产生异常,则首先会产生一个异常类的实例化对象。          2. 在try语句中对此异常对象进行捕捉。          3. 产生的异常对象与catch语句中的各个异常类型进行匹配,如果匹配成功则执行catch语句中的代码。         3> 根据对象的多态性,子类的实例化对象可以直接使用父类的对象进行接收。 在异常的处理中,也是可以使用这样的概念,因为try中产生的是一个实例化对象,如果现在有一些其他的无法知道的异常,则可以最后使用Exception进行捕获。 但是有一个注意点:捕获更粗的异常要放在捕获更细的异常之后(先捕获子类异常,再父类异常)。         4> 又出现了一个问题:既然所有的Exception对象都可以使用Exception接收,(都可以发生向上转型关系)直接使用Exception捕获异常不是更方便么? 这样虽然可以统一全部捕获到异常,但是在一个精细的开发中,是不建议这样使用的,因为,这样只是知道发生了异常,并不知道具体发生了什么异常,所以,最好分别进行捕获(先捕获子类异常,再父类异常)。         5> 又有一个问题:既然不过Exception是最方便的,那么直接捕获它的父类,Throwable岂不是更好?首先,这样的做法是可以的,因为Exception是Throwable的子类,但是正常的开发人员是不会这样做的,因为程序的try语句中永远只会抛出Exception的子类对象,Throwable不仅仅有Exception这个子类,还有Error这个子类。         6>          1.程序出现异常之后,如果没有合理的处理的话,则会导致程序的中断执行。          2.使用try—catch,和try–catch–finally,可以处理异常。finally将会作为异常的统一出口,不管是否出现异常都会执行此语句。         3.一个异常处理中,可以同时出现多个catch,但是捕获更粗的异常要放在捕获更细的异常之后,否则程序编译会报错(先捕获子类异常,再父类异常)。         4.在异常中,最大的类Throwable,分为两个子类,Exception,Error,其中Exception表示的是程序可以自己处理的异常,Error表示的是jvm错误,一般程序是无法处理的。                  5.捕获异常的时候,可以直接捕获Exception,但是最好分开捕获,如果所有的异常处理操作是一样的话,则也可以直接捕获Exception。         6.每当异常产生之后,会在程序中产生一个异常类的实例化对象,之后使用此对象与catch中的异常类型进行匹配,如果匹配成功则执行catch语句中的内容,如果匹配不成功,则继续向下匹配,如果都无法匹配成功,程序将出现中断执行的情况。         7> 总体来说,Java规定:对于可查异常必须捕捉、或者声明抛出。允许忽略不可查的RuntimeException和Error。     3.2 常见处理异常的几个关键字(try--catch finally throw throws)         1> try--catch--finally             1. Java规定:对于可查异常必须捕捉、或者声明抛出。允许忽略不可查的RuntimeException和Error             2. try块:用于捕获异常。其后可接零个或多个catch块,如果没有catch块,则必须跟一个finally块。             3. catch 块:用于处理try捕获到的异常。             4. finally块:无论是否捕获或处理异常,finally块里的语句都会被执行。当在try块或catch块中遇到return语句时,finally语句块将在方法返回之前被执行。             5. 匹配的原则是:如果抛出的异常对象属于catch子句的异常类,或者属于该异常类的子类,则认为生成的异常对象与catch块捕获的异常类型相匹配。             6. 不要在fianlly中使用return。不要在finally中抛出异常.减轻finally的任务,不要在finally中做一些其它的事情,finally块仅仅用来释放资源是最合适的。将尽量将所有的return写在函数的最后面,而不是try---catch---finally中。             7. 程序总将执行 finally 做为结束,除了一下几种情况:JVM 过早终止(调用 System.exit(int));在finally块中抛出一个未处理的异常;计算机断电、失火、或遭遇病毒攻击。         2> throw、throws             1. throws出现在方法函数头;而throw出现在函数体。             2. throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。             3. 两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。             4. Java中最大的头,就是jvm,所以,如果在主方法中使用了throws关键字,则表示一切的异常都交给jvm去处理,其实,Java默认的异常处理也是使用jvm完成的。     3.3 处理异常关键字的使用         1> 一般程序中使用自定义的异常类。通常继承Exception或者runTimeException