写的代码不可能十全十美,有的是会报错,一报错程序立马挂了
异常机制:程序中出现了异常,那系统可以将异常捕获并把处理掉,这样程序就不会挂掉,依然往后执行

异常分类

Throwable

  • Error

  • Exception

    • 编译时异常(检查性异常):需要强制性try catch
      • IOException
      • ……
    • 运行时异常(非检查性异常):一般不做处理
      • NullPointerException
      • ArithmeticException
      • ……

异常分类

处理

try…catch…finally

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
"一个抛,一个接"
try{

​```
可能抛出异常的代码
​```

}catch(异常类型1 变量名){
处理异常的代码
}catch(异常类型2 变量名){
处理异常的代码
}catch(异常类型3 变量名){
处理异常的代码
}finally{

}

获取异常信息的方式:

  1. getMessage(): 获取抛出的异常信息
  2. e.printStackTrace(); 在控制台打印出异常的详细信息

catch

catch里面的异常类型要和抛出的异常类型一致

多个catch时,里面的异常类型没有父子关系时,顺序没有要求
但是存在父子关系时,父类异常只能放在子类异常下面

finally

  1. 里面的代码不管是否发生异常都会执行

  2. 里面的代码会在return之前执行

  3. 主要用来干什么?

    关闭流 连接 回收资源等。

throws

在发生位置不处理抛出,交给方法的调用者去处理。

  1. 方法内部异常若不能立马处理的,可以通过throws抛出
  2. throws:可以在方法声明处定义此方法向外抛出的异常,这样就会将异常交给方法的调用者进行处理
  3. 一个方法可以抛出多个异常
  4. 继承时方法的重写问题
    • 子类重写父类方法时,抛出异常不能大于父类方法抛出的异常
    • 若父类方法为抛出异常,子类重写时也不能抛出异常

throw

throw:手动抛出异常

1
2
3
4
5
6
7
8
// 手动抛异常,注意:抛的是异常对象
try {
// 异常对象一般有两个构造方法,调用带参构造方法可以自定义异常信息
throw new ArithmeticException("算术异常");
}catch (ArithmeticException e) {
//System.out.println("异常:"+e.getMessage());
e.printStackTrace();
}

自定义异常

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 自定义异常继承RuntimeException
public class MyException extends RuntimeException {

/*
*添加两个构造方法,初始化message
*/
public MyException() {
super();
}

public MyException(String message){
super(message);
}

}