异常
1. 概述
java异常是java提供的一种识别及响应错误的一致性机制,java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。
throwable:异常类的最终父类,它有两个子类,Error与Exception。throwable常用的方法:
(1) getCause():返回抛出异常的原因。如果cause不存在或未知,则返回null。
(2) getMeage():返回异常的消息信息
(3) printStackTrace():对象的堆栈跟踪输出至错误输出流,作为字段System.err的值
Error(错误):表示程序无法处理的错误,一般与程序员的执行操作无关
(1) 理论上这些错误是不允许发生的,如果发生,也不应该试图通过程序去处理
(2) Error不是try-catch的处理对象,JVM一般的处理方式是终止发生错误的线程
(3) Error有两个子类:VirtualMachineError(虚拟机错误)和AWTError(AWT组件出错)
Exception(异常):出现原因取决于程序,所以程序也理应该通过try-catch处理。异常分为两类:检查异常和非检查异常
(1) 检查异常:编译器要求必须处理,否则不能通过编译,使用try-catch捕获或者throws抛出,常见的有:IOException
(2) 非检查异常(运行时异常):编译期不会检查,所以在程序中可不处理,但如果发生,会在运行时抛出。所以这类异常要尽量避免,常见的有Error和RuntimeException类及其子类。
java异常机制用到的关键字:try、catch、finally、throw、throws
(1) try:用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。
(2) catch:用于捕获异常。catch用来捕获try语句块中发生的异常
(3) finally:finally语句块总是会被执行
(4) throw:用于抛出异常
(5) throws:用在方法签名中,用于声明该方法可能抛出的异常。
2. try...catch...finally语句块
(1) try块中的局部变量和catch块中的局部变量(包括异常变量),以及finally中的局部变量,他们之间不可共享使用
(2) 每一个catch块用于处理一个异常,同一个try块下的多个catch异常类型有父子关系,应该将子类异常放在前面,父类异常放在后面,这样保证每个catch块都有存在的意义。
(3) 不管有没有异常,finally语句总会执行
(4) 当try、catch中有return时,finally中的代码仍然会继续执行
(5) finally语句中,对基本数据类型的变更,不会影响到try/catch模块;对包装类型、静态变量、全局变量的修改会影响到try/catch模块。
(6) finally代码中最好不要包含return,程序会提前退出,也就是说返回的值不是try或catch中的值
(7) finally中避免再次抛出异常
3. throws和throw的基本用法
4. 自定义异常
自定义检查异常:只需要扩展Exception类即可
自定义非检查异常:扩展自RuntimeException
自定义的异常应该总是包含如下的构造函数:
(1) 一个无参构造函数;
(2) 一个带有String参数的构造函数,并传递给父类的构造函数;
(3) 一个带有String参数和Throwable参数,并都传递给父类构造函数;
(4) 一个带有Throwable 参数的构造函数,并传递给父类的构造函数。