下面是算术异常。
抛出的异常其实是个类。
下面是空指针异常。
用异常时,下面语句不会执行。
上面这些是运行时异常
下面这是编译时异常。
在程序编译期间发生的异常,称为编译时异常,也称为受检查异常
- 如何抛出异常
代码触发异常和手动发出异常。
下面是手动触发异常。
异常的捕获
异常的捕获,也就是异常的具体处理方式,主要有两种:异常声明throws 以及 try-catch捕获处理。
下面throws后加的意思是告诉编译器这里可能会有异常
main中的test也需要事先声明异常。
声明异常后出现异常依然会报错,而且报错后语句不会执行。
可以用逗号声明多个异常。非受查异常也可以声明。
可以使用try catch处理异常。
下面这个可以打印错误信息。
受查异常,没有捕获到就会报错。
异常后直接进入catch,不打印sd。
两行异常可以这样放到一行。
下面这里用了Exception后,NULL会报错,因为Expection继承了所有异常,能捕获任何异常,把它放到第一个,那么后续异常没有任何问题了。
try中存在多个异常时,捕获第一个异常。只会抛出一个异常。
如果捕获中没有对应异常的catch,那么异常会交给JVM,程序中断,dff也就不会打印。
它的退出码是1,代表异常退出。
如果异常之间具有父子关系,一定是子类异常在前catch,父类异常在后catch,否则语法错误
比如不能Expection在第一个catch中。
- finally
不管try是否抛异常,finally中的代码都会执行。
所以finally一般用于进行资源释放。
根据编译器提示,把scanner写在try中,finally中就没有closel。
正常来说,finally一定会执行的。
下面这样也会执行finally。
throw用来抛出异常,throws用来声明异常。
- 自定义异常
有时候项目很复杂,不能像下面这样通过打印判断异常。这时候就需要自定义异常。
public class Test2 {
public String name = "asd";
public int id = 123;
public void testh(String str, int a) throws UserNameExpection, IdExpection {
if (!this.name.equals(str)) {
System.out.println("姓名错误");
throw new UserNameExpection();
}
if (this.id != a) {
System.out.println("id错误");
throw new IdExpection();
}
}
public static void main(String[] args) throws UserNameExpection, IdExpection {
try {
Test2 test2 = new Test2();
test2.testh("asdf", 123);
}
catch(UserNameExpection u){
u.printStackTrace();
System.out.println("用户名异常");
}
catch(IdExpection i)
{
i.printStackTrace();
System.out.println("id异常");
}
}
}
我们可以让异常打印特定的内容