一.异常处理机制的结构
Exception分为编译时异常和运行时异常
1.编译时异常(写代码时候就需要处理的异常):程序正确,但因为外在的环境条件不满足引发。
2.运行时异常(代码运行时候抛出的异常):程序存在bug,要更改程序来避免。
二.异常的处理
1.try-catch:捕获这个异常,自己处理了这个异常
try {
需要检查的代码(可能会抛出异常,也可能不会抛出异常)
} catch(异常的类型 异常类型的变量) {
捕获异常后要处理异常
} finally {
一定会被执行的代码(不管异常抛不抛出都会执行)
}
2.throws:抛出异常,我不处理这个异常,抛出异常
//抛出编译时异常,谁调用我谁去处理
public void show() throws ClassNotFoundException {
Class.forName("com.mysql.jdbc.Driver");
}
throws是在方法签名上
throw是在代码中抛出异常
三.多重捕获块
try {
需要检测的代码(可能会抛出异常,也可能不会抛出异常)
} catch (异常的类型1 异常类型的变量1) {
捕获异常后处理异常
} catch (异常的类型2 异常类型的变量2) {
捕获异常后处理异常
} catch (异常的类型3 异常类型的变量3) {
捕获异常后处理异常
} finally {
一定会被执行的代码(不管异常抛不抛出都会执行,例如数据库释放连接)
}
注:越往下层catch,其异常包含的范围越广
四.自定义异常
要求:
1、所有的异常的都是Throwable的子类
2、如果写一个运行时异常,需要继承RuntimeException
3、如果要写一个编译时异常,继承Exception
public class MeiQianException extends Exception{
//message代表抛出这个异常要打印的错误信息
public MeiQianException(String message) {
super(message);
}
}
@Test
public void test22() {
try {
quQian(1900);
} catch (MeiQianException e) {
e.printStackTrace();
}
}
public void quQian(double money) throws MeiQianException {
if (money >= 1000) {
throw new MeiQianException("钱不够");
}
System.out.println("钱够了");
}