文章目录
一、异常
1. 异常是什么
异常:程序在运行过程中发生的一些不正常的行为。
分类:
1.受查异常 (编译时异常)——需要在编译时处理掉,否则影响程序运行
例如:
2.非受查异常 (运行时异常)
2 . 异常的五个关键字
- throw、try、catch、 final、throws
二、异常的操作
1.抛出
>throw new XXXException(“异常发生的原因”); //java中使用throw关键字(new)抛出一个指定的异常对象。
XXXException中的XXX指抛出的异常类型;
1.throw必须写在具体的方法体中;
2.一旦异常抛出,异常其后的代码将不会执行
3.抛出的异常是是 RunTimeException 或者 RunTimeException 的子类,则可以不用处理,JVM会直接处理,但如果是编译时异常,用户必须处理;
4.抛出的异常必须继承Eception或者是Ecepthion的子类;
2.捕获
2.3.1 异常声明throws
throws处于方法声明时参数列表之后,即当前方法不处理异常,提醒给方法调用者处理。
语法格式:
修饰符 返回值类型 方法名(参数列表) throws 异常类型1,异常类型2…{
}
- throw必须放在方法体的参数列表后;
- 声明的异常与跑出的异常同样必须为Exception或者Exception的子类;
- throws声明多个异常时,异常之间可以用逗号隔开,但会导致编译时不清楚具体是哪个throws声明中的异常;
- 调用声明异常的方法时,调用者必须处理异常亦或是继续使用throws声明异常;
2.3.2 try-catch捕获并处理
throws只是对异常进行了声明。需要方法的调用者去处理这个异常,但用户想真正处理异常时,我们会用到try-catch。
语法格式:
try{
xxxxxxxx //可能出现异常的代码;
}catch(要捕获的异常类型 e){ // 如果try中的代码抛出异常了,(只要是处catch捕获时异常类型与try中抛出的异常类型一致时,或者是try中抛出异常的基类时,就会被捕获到)
xxxxxxxxxxxx // 对异常的处理,处理完成后,跳出try-catch结构,继续执行之后序代码
}
try块中可能会抛出多个异常对象,这时候就需要catch捕获多个异常并处理,可以在catch{}后继续添加对异常的处理,如下:(多个异常多种捕获)
try{
1.xxxxxxxxxxxxx //第一种将可能出现异常的代码
2.xxxxxxxxxxxxx //第二种将可能出现异常的代码
3.xxxxxxxxxxxxx //第三种将可能出现异常的代码
}catch(要捕获的异常类型1 e){
// 如果try中的代码抛出异常了,此处catch捕获时异常类型与try中抛出的异常类型一致时,或者是try中抛出异常的基类时,就会被捕获到
xxxxxxxxx 对异常的处理1 // 对异常就可以正常处理,处理完成后,跳出try-catch结构,继续执行后序代码
}catch(要捕获到异常类型2 e){
xxxxxxxxx 对异常的处理2 // 对异常进行处理
}catch…
当多个捕获到的异常的处理方式是一样的,可以用一个catch捕获,但是要在try块中抛出要出现的所有捕获到处理方式一样的异常
try{
1.xxxxxxxxxxxxx //第一种将可能出现异常的代码
2.xxxxxxxxxxxxx //第二种将可能出现异常的代码
3.xxxxxxxxxxxxx //第三种将可能出现异常的代码
}catch(要捕获的异常类型1 e | 要捕获的异常类型2 e ){
// 如果try中的代码抛出异常了,此处catch捕获时异常类型与try中抛出的异常类型一致时,或者是try中抛出异
常的基类时,就会被捕获到
xxxxxxxxx 对异常的处理 // 对异常就可以正常处理,处理完成后,跳出try-catch结构,继续执行后序代码
}
也可以通过catch捕获所有异常(多个异常一次捕获)不推荐使用
try{
1.xxxxxxxxxxxxx //第一种将可能出现异常的代码
2.xxxxxxxxxxxxx //第二种将可能出现异常的代码
3.xxxxxxxxxxxxx //第三种将可能出现异常的代码
}catch(Eception e ){
// 如果try中的代码抛出异常了,此处catch捕获时异常类型与try中抛出的异常类型一致时,或者是try中抛出异
常的基类时,就会被捕获到
xxxxxxxxx 对异常的处理 // 对异常就可以正常处理,处理完成后,跳出try-catch结构,继续执行后序代码
}
注意:
1.try块抛出异常的位置之后代码将不会被执行;
2.若抛出的异常与catch捕获的异常不匹配,则异常不会被捕获,亦不会被处理,将会继续向外抛出直到被JVM捕获,异常是根据类型来捕获的。
3.当异常时父子关系时,子类异常在前catch,父类异常在后catch,否则语法错误:
2.3.3 finally
finally用来处理一些特定要被执行的代码,即无论代码是否抛出异常都需要被执行,异常会引发程序的跳转,因此可能会导致有些语句执行不到
语法格式:
try{
可能会发生异常的代码
}catch(异常类型 e){
对捕获到的异常进行处理
}finally{
无论是否发生异常,都会被执行到 //不建议在这里写return,会被编译器警告
}
// 没有抛出异常/异常被捕获处理了,这里的代码也会执行
虽然finally 和 try-catch-finally 后的代码都会执行,finally一般进行一些资源清理的扫尾工作
三、自定义的异常类
虽然java已经设置了很多种异常类,但在实际运用中我们还是需要根据实际情况,设置维护符合我们的异常结构。
我们基于已有的异常类进行扩展,创建我们自己所需要的异常类
1.自定义异常类,然后继承自Exception 或者 RunTimeException
2.根据上述我们所说的异常的抛出、声明、捕获并处理的方法使用自定义类的异常
注意
1.自定义异常通常会继承自 Exception 或者 RuntimeException
2.继承自 Exception 的异常默认是受查异常
3.继承自 RuntimeException 的异常默认是非受查异常.
四、总结
异常的种类有很多,虽然java中已经有丰富的异常类了,但在实际运用中,我们还是需要根据实际情况来自定义一些自己的异常结构,因此我们必须掌握好异常的抛出、声明、捕获和处理的语法格式和注意事项,以及特定时被执行的代码使用的关键字等。