异常
异常继承结构
Throwable
|- Error 系统级错误
|- Exception 异常,可修复的错误
|- 其他Exception
|- RuntimeException
|- NullPointerException
|- ArrayIndexOutOfBoundsException
|- NumberFormatException
|- ArithmeticException
|- ClassCastException
|- InputMismatchException
|- ...
捕获异常
try {
} catch(AException e) {
} catch(BException e) {
} catch(父类型Exception e) {
} finally {
不管出现不出现异常,
都会被执行
}
添加异常抛出管道
void f() throws A,B,C,D {
}
*)一种异常,必须存在抛出管道才能抛出
*)如果没有管道,必须捕获
*)任何方法,都默认存在 RuntimeException 抛出管道
*)RuntimeException 及其子类型异常,
不设置抛出管道,也能抛出
* throw
手动抛出异常对象
异常包装
捕获的异常对象,
包装在另一种类型异常对象中,再抛出
使用场景:
*)不能抛出的异常类型,
包装成能抛出的类型,再抛出
*)多种类型异常,简化成一种类型
* 自定义异常
为了表示与具体业务相关的错误情况,
异常继承结构
Throwable
|- Error 系统级错误
|- Exception 异常,可修复的错误
|- 其他Exception
|- RuntimeException
|- NullPointerException
|- ArrayIndexOutOfBoundsException
|- NumberFormatException
|- ArithmeticException
|- ClassCastException
|- InputMismatchException
|- ...
捕获异常
try {
} catch(AException e) {
} catch(BException e) {
} catch(父类型Exception e) {
} finally {
不管出现不出现异常,
都会被执行
}
添加异常抛出管道
void f() throws A,B,C,D {
}
*)一种异常,必须存在抛出管道才能抛出
*)如果没有管道,必须捕获
*)任何方法,都默认存在 RuntimeException 抛出管道
*)RuntimeException 及其子类型异常,
不设置抛出管道,也能抛出
* throw
手动抛出异常对象
异常包装
捕获的异常对象,
包装在另一种类型异常对象中,再抛出
使用场景:
*)不能抛出的异常类型,
包装成能抛出的类型,再抛出
*)多种类型异常,简化成一种类型
* 自定义异常
为了表示与具体业务相关的错误情况,
可以自定义新的异常类型
运行时异常:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。
非运行时异常 (编译异常):是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。