二十三.异常
1.概念:
在java语言中,将程序执行中发生的不正常情况称为异常
2.分类:
1.Error:java虚拟机无法解决的严重问题,如jvm系统内部错误,资源耗尽等
2.Exception:因编程错误,或偶然的外部因素导致的一般性问题,可以使用正对性的代码处理,例如空指针访问,网络中断等.
Exception分为两大类,运行时异常和编译时异常
检查时异常
概念:因语法问题导致的错误
解决:修改语法
运行时异常
概念:但是因为编写时思路问题,或传入的数据导致程序无法正常运行
解决:更换思路,修改传入的数据,加入容错判断
体系结构:
Throwable:
Error(错误)
Exception(异常) :CheckedException(检查时异常),RuntimeException(运行时异常)
3.五大运行异常
1. NullPointerException 空指针异常
当应用程序试图在需要对象的地方使用null时,抛出该异常
2. ArithmeticException 数学运算异常
当出现异常的运算条件时,抛出此异常
3. ArrayIndexOutOfBoundsException数组下标越界异常
用非法索引访问数组时抛出异常,如果索引为负或大于等于数组,则为非法索引
4. ClassCastException类型转换异常
当时图将对象强制转换为不是实例的子类时,抛出该异常
5. NumberFormatException数字格式不正确异常
当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常=>使用异常我们可以确保输入是满足条件数字
4.编译异常
SQLException 操作数据库时查询表可能发生异常
IOException 操作文件时发生异常
FileNotFoundException 当操作一个不存在的文件时,发生异常
ClassNotFoundException 加载类,而类不存在时,发生异常
EOFException 操作文件,到文件末尾,发生异常
IllegalArguementException 参数异常
5.异常处理方式
try-catch
语法:
try{
异常代码
}catch(异常类型 变量名){
处理方式
}catch(异常类型 变量名){
处理方式
}.....
catch(异常类型 变量名){
处理方式
}finally{
必须执行的代码
}
注意:
1.如果发生异常,则异常后面的代码不再执行,直接进入catch
2.如果没有异常发生,则顺序执行try的代码块,不会进入catch
3.如果希望不管是否发生异常,都执行某段代码(关闭连接,释放资源)则使用finally
4.可以有多个catch语句,捕获不同的异常(进行不同的业务处理),要求父类异常在后,子类异常在前,比如(Exception在后,NULLpointerException在前)如果发生异常,只会匹配一个catch
5.也可以使用try-finally配合使用,**这种用法相当于没有捕获异常**,因此程序会崩。应用场景,就是执行一段代码,不管是否发生异常,都必须执行某个业务逻辑
6.捕获异常后,有return时,执行return但不会返回return的后缀, 执行finally
throws:
将发生的异常抛出,交给调用者自行处理,最顶尖的处理者是JVM
语法:
throws 异常类型1,异常类型2....
使用位置方法的形参之后
基本介绍:
1.如果一个方法中的语句执行时,可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示声明抛出异常,表明该方法将不对异常进行处理,而是由方法的调用者处理
2.在方法声明时,可以使用throws抛出异常,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类.
3.throws可以抛出多个异常
细节:
1. 对于编译异常,程序中必须处理,比如:try-catch或者throws
2. 对于运行时异常,程序中如果没有处理,默认就是throws的处理方式
3. 子类重写父类方法时,对抛出异常的规定:子类重写的方法,所抛出的异常类型要么和父类抛出的异常一致,要么为父类抛出异常类型的子类
4. 在throws过程中,如果有方法try-catch,就相当于处理异常,就可以不必thows
throw
语法:
throw 异常对象;
位置:方法中
6.自定义异常
当程序中出现某些错误时,但是该错误信息并没有在Throwable子类中描述处理,这个时候可以自己设计异常类,用于描述错误信息.
1.步骤:
1.定义类:自定义异常类,
2.异常类类名继承Exception或者RuntimeException
3.编写其构造函数