异常处理机制
TIP
java中所有错误的超类为Throwable,其下有两个子类:Error和Exception
Error的子类描述的都是系统错误,比如虚拟机内存溢出等
Exception的子类描述的都是程序错误,比如空指针、下标越界
通常程序中处理的异常都是Exception
异常处理机制中的try-catch
语法
try{ 可能出现异常的代码片段 }catch(XXXException e){ 出现异常后的处理代码 }
注意
try语句不能独立存在,后面必须跟catch或者finally
异常处理机制中的finally
- finally块定义在异常处理机制中的最后一块。它可恶意直接跟在try之后,或者最后一个catch之后
- finally可以保证只要程序执行到try语句块中,无论try语句块中的代码是否出现异常,最终finally都必定执行
- finally通常用来释放资源这类操作
自动关闭特性
JDK7之后,java提供了一个新的特性:自动关闭。指在IO操作中可以更简洁的使用异常处理机制完成最后的close操作
语法:
try( 定义需要在finally中调用close方法关闭的对象 ){ IO操作 }catch(XXXException e){ ··· }
上述语法中可以在try的“()”中定义的并初始化的对象必须实现了java.io.AutoCloseable接口,否则编译不通过
throw关键字
throw用来对外主动抛出一个异常,通常下面两种情况主动对外抛出:
- 当程序遇到一个满足语法,但是不满足业务要求是,可以抛出一个异常给调用者
- 程序执行遇到一个异常,但是该异常不应当在当前代码片段被解决时可以抛出给调用者
throws关键字
当一个方法中使用throw抛出一个非RuntimeException异常时,就要在给方法上使用throws声明这个异常的抛出,此时调用该方法的代码就必须处理这个异常,否则编译不通过,处理手段有两种:
使用try-catch捕获并处理这个异常
在当前方法上继续使用throws声明该异常的抛出给调用者解决
永远不应当在main方法上使用throws
Java异常可以分为两种:
- 可检测异常:可检测异常经编译器验证,对于声明抛出异常的任何方法,编译器将强制执行处理或声明规则,不捕捉这个异常,编译器就通不过,不允许编译
- 非检测异常:非检测异常不遵循处理或声明规则。在生产次类异常时,不一定非要采取任何适当操作,编译器不会检查是否已经解决了这样一个异常
- RuntimeException类属于非检测异常
常见的RuntimeException子类
- IllegalArgumentException:抛出的异常表明箱方法传递了一个不合法的参数
- NullPointException:当应用程序试图在需要对象的地方使用null时,抛出该异常
- ArrayIndexOutOfBoundsExcetion:当使用的数组下班超出数组允许范围是,抛出该异常
- ClassCastException:当试图将对象强转为不是实例的子类是,抛出该异常
- NumberFormatException:当应用程序视图将字符串转换成一种数值类型,但该字符串不能转换为适当格式是,抛出该异常
自定义异常
自定义异常通常用来定义哪些业务上的异常问题
定义自定义异常需要注意的问题:
- 异常的类名要做到见名知意
- 需要是Exception的子类
- 提供超类异常提供的所有种类构造器