目录
一:异常的概念和体系结构
1.概念
2.体系结构
3.异常分类
二:异常的处理
1.防御式编程
2.异常的抛出
3.异常的捕获
4.异常的处理流程
三:自定义异常
一:异常的概念和体系结构
1.概念
(1)在Java中,在程序执行过程中发生的不正常的行为称为异常
(2)常见的的异常
2.体系结构
3.异常分类
(1)编译时异常(受查异常)
编译时报错
(2)运行时异常(非受查异常)
比如:NullPointerException、ArrayIndexOutOfBoundsException、ArithmeticException
注意:编译时出现的语法错误不能称为异常
二:异常的处理
1.防御式编程:
(1)LBYL:事前防御型(if)
(2)EAFP:事后认错型(try、catch、finally)
2.异常的抛出
(1)在Java中,异常处理主要的5个关键字:throw、try、catch、final、throws
(2)抛出异常:throw必须写在方法体里面,异常一旦抛出,后面的代码就不会执行
throw new xxxException("异常产生的原因");
3.异常的捕获
(1)异常声明throws:通过throws处理编译时异常
【这个详细代码在后面自定义类型】
(2)try-catch
throws对异常并没有真正处理,而是将异常报告给抛出异常方法的调用者,由调用者处理。如果真正要对异常进行处理,就需要try-catch
语法格式:
try{
//将可能出现异常的代码放在这里
}catch(要捕获的类型 e ){
//如果try中的代码抛出异常了,此处的catch捕获时异常类型与try中跑出的类型一致,或者是try中抛出的异常的父类时,就会被捕获到
//对异常就可以正常处理,处理完毕后,跳出try-catch结构,继续执行后续代码
}
catch(要捕获的类型 e ){
//try中可能抛出多个不同的异常对象,则必须使用多个catch来捕获
}finally{
//此处代码一定会执行
}
//后续代码
//当异常被捕获到了,异常就被处理了,这里的后续代码一定会被执行到
//如果捕获了,但是捕获类型不同,就为白捕获,这里的代码也不会执行到
4.异常的处理流程
(1)程序先执行try中的代码
(2)如果try中的代码出现异常,就会结束try中的代码,看catch中的异常类型是否匹配
(3)如果找到匹配的异常类型,就会执行catch中的代码
(4)如果没有找到匹配的异常类型,就会向上传递到上层调用者
(5)无论是否找到匹配的异常类型,finally中的代码都会被执行到(在该方法结束之前执行)
(6)如果上层调用者没有处理的了异常,就会继续向上传递
(7)一直到main方法也没有合适的代码处理异常,就会交给JVM来进行处理,此时程序就会异常终止
三:自定义异常
1.前提
Java中虽然内置了丰富的异常类,但是并不能完全表示实际开发中遇到的一种异常,此时就需要维护复合实际情况的异常结构
2.具体方式
(1)自定义异常类,然后继承自Exception或RunTimeException
(2)实现一个带有String类型参数的构造方法,参数含义:出现异常的的原因
(3)
public class PasswordException extends Exception{
public PasswordException(String message){
super(message);
}
}
public class NameException extends Exception{
public NameException(String message){
super(message);
}
}
public class Login {
private String name="admin";
private String password="1234";
public static void loginInfo(String name,String password) throws NameException, PasswordException {
if(!name.equals(name)){
throw new NameException("用户名错误");
}
if(!password.equals(password)){
throw new PasswordException("用户名错误");
}
System.out.println("登陆成功");
}
public static void main(String[] args) {
try {
loginInfo("amdin","1234");
} catch (NameException e) {
throw new RuntimeException(e);
} catch (PasswordException e) {
throw new RuntimeException(e);
}
}
}
3.注意事项
继承自Exception的异常默认是受查异常;继承自RunTimeException的异常默认是非受查异常