1、异常
什么是异常?不正常就是异常
1、出现异常时,jvm会处理程序中未处理的异常:
- 暂停程序
- 报错(报错时会提示异常内容,包括什么异常,原因描述,异常行数)
2.不要让jvm去处理异常
异常处理:java提供了完整的异常的处理方案,可以帮助我们在编写的过程中,处理程序中的异常处理信息。
异常处理的关键字:try-catch-finally,throw,throws
1、try-catch
语法结构:
try {
//有可能出现异常的代码块
}catch(声明异常){
//异常解决办法
}
执行顺序:
1:执行try块中的内容
2:如果try块中的内容出现异常信息,执行catch块
3:匹配catch中声明的异常信息,如果匹配上,则执行catch中的代码
4:继续执行后续代码
5:如果catch中的异常信息没有匹配到,那么此时交由jvm处理异常
6:catch中的类型一定要注意,要能够捕获到try块中实际出现的异常信息,如果忘记了具体的异常信息可以通过使用Exception去捕获异常信息,不要在catch块中做业务逻辑判定
2、多层catch语法结构:
try{
//可能出现异常的代码段
}catch(异常1){
//异常的解决办法
}catch(异常2){
//异常的解决办法
}…{
}
try多层catch执行顺序:
1:执行try块 如果出现异常 new出现当前异常对象
2:逐一匹配catch中的异常内容
3:如果匹配上,执行对应的catch中的代码,整个try-catch执行结束
4:如果没有匹配上jvm会去解决当前异常信息
注意事项:
1:在多重catch中一般情况下会在最后一个catch语句中编写exception,用来捕获可能未识别的异常信息
2:不要在第一个catch中编写父类异常,会导致所有的子类被屏蔽。
异常对象的常见方法:
toString:当前异常类型以及原因描述
printStackTrace:打印堆栈信息,会出现异常类型以及原因描述和异常位置错误。
getMessage:异常原因
3、try-catch-finally
语法结构:
try{
//可能出现异常的代码
}catch(异常1){
//处理办法
}…{
}finally{
//代码块
关闭资源的代码
}
执行顺序:
1:执行try块中的代码,如果出现异常 new出当前异常对象
2:逐一匹配catch中的异常内容
3:如果匹配上,执行对应的catch中的代码
4:如果未匹配上,jvm去解决当前异常信息
5:不论是否匹配成功,都会执行finally中的内容
finally中一般情况下编写关闭资源的操作
注意: 1:return语句不会让finally不执行
2:finally先于return语句执行
3:代码中存在System.exit(),可以让finally不执行
4、 try()-catch()-finally
Jdk1.7之后对于try-catch-finally的改变:
可以通过对于流、网络连接对象的创建声明在try的()中,后续无需通过finally显式关闭资源。
语法结构:
try(资源1,资源2…){
//可能出现的异常信息
}catch(异常1){
//解决办法
}..{
}
5、异常的分类
异常分为两类,一类是checked异常,它会在编译期间就会出现异常错误;另一类是Runtime异常,它在编译期间不会报异常,但是运行就会报,在出现中更加难解决,因为不报异常错误。
6、异常机制:throw和throws
1:throw声明当前代码块中可能存在的异常信息,并且将当前异常信息抛出给调用者。
对于调用者而言,可以通过try-catch捕获异常,如果都不管的话,jvm就会去处理异常。
2:throw会导致当前程序中断掉,后续代码不执行
3:throw定义在方法的内部,声明当前方法可能出现异常信息,可以导致当前程序中断。
4:throws在方法外,对外抛出某个异常,调用者解决当前异常,main方法中对外抛出的异常全部都由jvm做。
5:throws抛出异常,是异常解决的一种办法,定义在方法的外部,形式参数后,可以抛出多个异常通过“”,分割。
一般会将throws和throw在一起使用,throw声明的异常时检查时异常需要和throws一起使用,但是throws可以单独使用。
7、自定义异常
1:jdk中提供的异常信息不满足目前的使用
2:如何自定义异常:
a:声明一个自定义异常类
b:继承Exception
c:编写两个构造器,一个空,一个带字符串的构造器