一、异常
java.lang.Throwable是所有异常的顶级超类,它的下面派生了俩个子类
error:错误,表示系统级别错误,是不可恢复的错误,比如说虚拟机内存溢出
Exception:异常/意外,表示程序级别的异常,是可以通过异常处理机制恢复的错误
二、异常处理机制解决的问题
正常程序能走完,但因为某些特殊原因,像网络问题、突发情况发生时,在程序运行过程中可以进行修复的问题,才需要使用异常处理机制来解决。这时才需要使用异常处理机制来做个B计划。直白的说:你明知道会发生,但是还没有办法通过逻辑来处理的问题,才需要异常处理机制帮助解决。
三、异常处理机制
示例:
try {
// 可能会发生异常的语句
} catch(ExceptionType e) {
// 处理异常语句
} catch(ExceptionType e) {
// 处理异常语句
} catch(ExceptionType e) {
// 处理异常语句
}finall{ //无论有无异常必定会走到的代码片段
...
1、try...catch(){}
try块中某句代码如果出现了异常,那么try块中此举及以下代码都不会执行了
try语句中如果不出现异常,catch块不执行
2、finally:
是异常处理机制中的最后一块**,不能独立存在**,它可以跟着try后(try...finally),或最后一个catch后(try...catctch...finally)
注意:
1、finally可以保证无论try块中是否出现异常,最后finally都必定执行。通常用来做释放资源这类操作。
2、**JDK7**之后,java提供了一个新特性:自动关闭特性。旨在IO操作中可以更简洁的使用异常处理机制完成最后的close操作。
自动流关闭
- 语法
JDK1.7后推出的特性:自动关闭特性
try (
定义需要在finally中的流关闭更能(自动流关闭)
) {
读写或其他操作
} catch (FileNotFoundException e) {
e.printStackTrace();
}
3、throw
用于对外主动抛出一个异常,通常请款下下面俩种情况我们主动对外抛出异常
当程序遇到一个满足语法,但是不满足业务要求时,可以抛出一个异常告知调用者,程序执行遇到一个异常,但是该异常不应当在当前代码片段中被解决时可以抛出给调用者
4、throws
当一个方法中使用throw抛出一个检查异常时,就要在该方法上使用throws声明这个异常的抛出。此时调用该方法的代码就必须处理这个异常,否则编译编译。
注意:当我们调用一个含有throws声明异常抛出的方法时,编译器要求我们必须处理这个异常,否则编译不通过。处理手段有两种:
- 1 使用try-catch捕获并处理这个异常
- 2 在当前方法上继续使用throws声明该异常的抛出给调用者解决。具体选取 那种取决于异常处理的责任问题。
- 3不要在main()方法上throws。
四、异常分俩种
检查异常和非检查异常,检查是由编译器检查,检查的是当你抛出异常之后,你是否写了异常处理手段(try...catch若throws)
检查异常::当抛出异常时,检查你是否做了异常处理,若不处理则编译错误 **非检查异常:**当抛出异常时,不管你做没做异常处理,都不报错,只有RuntimeException家族的才是非检查异常,当然它的子类也是非检查异常。
常见的RuntimeException的子类- 运行时异常
类型错误转换,数组下标访问越界,空指针异常、找不到指定类等等。
自定义异常
自定义异常:通常用于定义那些不满足业务场景的异常
自定义异常的几个要素:
1:类名要做到见名知义
2:需要继承自Exception(直接或间接继承均可)
3:提供超类异常提供的所有构造器
代码案例:
package exception;
import java.io.FileNotFoundException;
public class Student {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) throws IllegalAgeException {
if(age < 0 || age >100){
/*
当使用threw抛出一个 非RuntimeException检查异常时,必须在当前方法上用throws声明该异常的抛出
*/
throw new IllegalAgeException("年龄不合法");
}
this.age = age;
}
}