什么是异常

我们在编写程序的时候,难免会出现Bug,这些bug就是异常。这些异常的发生往往会中断程序的运行。

异常的分类(Exception)

编译时异常

在编译器编辑的时候就发现的异常,通常编译器会会报红

  1. 这种也称之为可检测的异常
  2. 必须要处理

运行时异常

  1. 编译可以正常的通过,但是运行会报错。比如:空指针异常,数组下标越界等等…..
  2. 这种也称之为未检测的异常,不一定会触发
  3. 可处理也可以不用处理

处理异常

积极处理:捕捉异常

try…catch

语法

1
2
3
4
5
try{
要进行捕捉错误的代码,可能会出现异常的代码
}catch(异常种类 对象名){
处理方式
}

try和catch不能单独使用

选择异常种类时,尽量明确异常的种类,少使用exception

未使用捕捉

使用捕捉

try…catch…catch

捕捉多个异常,因为一个try可能会不止一个异常,这时候需要多个catch进行解决

1
2
3
4
5
6
7
try{

}catch(){

}catch(){

}

像else if一样,异常会根据catch()括号里面的异常类型来选择进入哪个catch。

要注意一个点,父类异常类如果在第一个catch,那么子类异常类就不能往后写了

1
2
3
4
5
6
7
try{

}catch(Exception e){

}catch(a e){

}

因为Exception是a的父类,exception包含了a的异常类,所以异常发生的时候,会先进入父类,会造成子类完全访问不到

try…catch…finally

1
2
3
4
5
6
7
try{

}catch(){

}finally{

}

try无论捉没捉到异常,finally里面的语句都会被执行

try….with….resources(自动回收)

一般像普通程序捕捉异常,会手动回收异常类,调用close方法

如果用了resources语法,则可以不用手动回收

1
2
3
4
5
try(需要回收的对象){

}catch(){

}

消极处理

通过throw来将异常抛出,谁调用谁处理

如果抛出的是RuntimeException异常类,则可以处理也可以不处理

尽量使用积极处理

throw和throws

throw new 异常类

  1. throws用在函数声明上,后面可以跟多个异常类,用逗号隔开
  2. throw后跟的是异常对象

throw如果手动引发一个编译时的异常,那么该异常就一定要处理!

如果是引发的一个运行时的异常,那么该异常可处理也可以不用处理

自定义异常

除了使用系统自带的异常规则,我们也可以自己去建立异常规则。

比如系统计算数学,0不能作为除数,而我们想加一条规则,负数不能作为除数,这个时候就要用到自定义异常了

1
2
3
4
5
6
7
8
9
10
11
12
public class MyException extends 异常类{
public MyException(){}
public MyException(String message){
super(message);
}
}
public static int show(int a, int b) throws MyException {//方法将错误接着抛出,调用该方法的地方需要用try进行捕捉异常
if (a < 0) {
throw new MyException("除数不能为负数"); //将错误抛出
}
return a / b;
}