异常

什么是异常
所谓的异常就是程序在编译过程中或者运行过程中出现的问题!!
异常的继承体系
根类:Throwable
    子类: Exception(异常类) 一般是程序编写不当造成的
    子类: Error(错误类) 一般是由系统引起/硬件问题
    • 运行时异常:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
      运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。
    • 非运行时异常 (编译异常):是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOExceptionSQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。
异常类中常用的三个方法
public void printStackTrace();打印当前异常对象的详细信息(异常的类型,异常的原因,异常的位置)[只用这个]
public String getMessage(); 获取异常的部分信息(异常的原因) 
public String toString(); 获取异常的类型和异常描述信息   
异常的分类

编译时异常

在编译时期报错了,提示可能有异常!
Exception以及其子类(RuntimeException除外)都属于编译时异常   
比如: SimpleDateFormat的parse方法   

运行时异常

在编译时期不报错,运行时期才出现异常!
RuntimeException以及其子类都属于运行时异常    
比如: 空指针异常,数组越界异常,类型转换异常  

异常的注意事项

a.运行时异常被抛出可以不处理。即不捕获也不声明抛出。[非常重要!!]
b.如果父类的方法声明抛出了多个异常,子类覆盖(重写)父类方法时,只能声明抛出相同的异常或者是他的子集。
c.如果父类的方法没有声明抛出异常,子类覆盖(重写)父类方法时,也不能声明抛出异常(多线程中就会用到)
d.多个异常我们如何捕获处理??[非常重要!!]
        代码1; //声明抛出OneException 
        代码2; //声明抛出TwoException
        代码3; //声明抛出ThreeException
i.分开捕获分开处理
        try{
           代码1; //声明抛出OneException 
        }catch(OneException e){
             e.printStackTrace();   
        }
        try{
           代码2; //声明抛出TwoException
        }catch(TwoException e){
             e.printStackTrace();   
        }
        try{
           代码3; //声明抛出ThreeException
        }catch(ThreeException e){
             e.printStackTrace();   
        }
ii.一起捕获,分开处理
        try{
            代码1; //声明抛出OneException  extends TwoException 
            代码2; //声明抛出TwoException
            代码3; //声明抛出ThreeException
        }catch(OneException e){
             e.printStackTrace();   
        }catch(TwoException e){
             e.printStackTrace();   
        }catch(ThreeException e){
             e.printStackTrace();   
        }

iii.一起获取一起处理[最常用的!!]
        try{
            代码1; //声明抛出OneException 
            代码2; //声明抛出TwoException
            代码3; //声明抛出ThreeException
        }catch(Exception e){
             e.printStackTrace();   
        }

e.当选择ii中处理多个异常时,如果这些异常有子父类关系,那么必须先处理子类异常,再父类异常
f.在try/catch后可以追加finally代码块,其中的代码一定会被执行,通常用于资源回收(IO流的关系,网络连接关闭) 
原文地址:https://www.cnblogs.com/xiaozhang666/p/13153648.html