异常
基本概念
java语言中,将程序执行中发生的不正常情况称为异常,(开发过程中的语法问题和逻辑错误不是异常)
- 异常可以分为两大类:Error和Exception
Error(错误)
Java虚拟机无法结局的严重问题,例如JVM系统的内部错误,资源耗尽等严重情况,比如:栈溢出,OOM(out of memory),Error是很严重的错误,系统会崩溃
Exception
其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理,例如空指针访问,试图读取不存在的文件,网络连接中断,Exception可以分为两大类运行时异常,以及编译时异常
异常体系图
- 运行时异常:指的是编译器检测不出来,一般指的是编译时的逻辑错误(除数为0),是程序员应该避免其出现的异常,java.lang.RuntimeException类及他的子类都是运行时异常
- 对于运行时异常,可以不做处理,因为这类异常很普遍,若全处理可能会对程序的可读性和运行效率产生影响
- 编译时异常,是编译器要求处置的异常
常见的运行时异常包括
- NullPointerException,空指针异常
- ArithmeticException数字运算异常
- ArrayIndexOutOfBoundsException数组下标越界异常
- ClassCastException类型转换异常
- NumberFormatException数字格式不正确异常
编译异常
介绍:
其他因编程错误或偶然的外在因素导致的一般性问题,编译期间就必须处理的异常,否则代码不能通过编译
- 常见的编译异常:
-
- SQLException 操作数据库时,查询表可能发生的异常
- IOEception 操作文件时发生的异常
- FileNotFoundException 当操作一个不存在的文件时,发生异常
- ClassNotFoundException 加载类发现类不存在时发生的异常
- EOFException 操作文件,到文件末尾,发生的异常
- IllegalArguementException 参数异常
异常处理机制
基本介绍
异常处理就是当异常发生时,对异常处理的方式
异常处理的方式
- try—catch -finally
程序员在代码中捕获的异常,自行处理
try{
代码//可能会发生的异常
}catch (Exception e){
//捕获到的异常
1. 当异常发生的时候
2. 系统会把发生的异常封装成exception对象e传给catch
3,得到异常对象后程序员自行处理
4,如果没有异常,那么catch就不会执行
}
finally{
不论有没有异常都会执行
}
- throws
将发生的异常抛出,交给调用者处理,最顶级的处理者就是JVM
throws的处理机制
try—catch细节
- 如果异常发生了,则异常后面的代码不会执行,会直接进入catch块中
- 如果没有异常发生,那么则会直接跳过chatch代码块
- 如果不论异常是否发生,都要执行某段代码(例如释放资源,关闭链接),则使用finally{}
- 可以有多个catch,分别捕获多个异常,但是要求子类异常放在前面,父类放在后面
- 可以使用try-finally配合使用,这种用法相当于没有捕获异常,因此程序会直接崩掉,应用在一段代码不论是否会崩掉,都要执行某个业务逻辑
throws
- 如果一个方法可能会生成某种异常,但是不能确定如何处理这种异常,则此方法应显示的抛出异常,表明该方法将不对这些异常进行处理,
- 在方法中声明用throws语句可以抛出异常的列表;throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类
throws使用细节
- 对于编译时异常,我们必须使用throws或者try-catch
- 对于运行时异常,程序如果没有处理,默认就是throws的处理方法
- 子类所抛出的异常类型要么和父类一致,要么为父类抛出异常类型的子类
- 在throws中有try-catch方法,就相当于处理异常,就可以不必throws
意义 | 位置 | 后面跟的东西 | |
---|---|---|---|
throws | 异常处理的一种方法 | 方法的声明出 | 异常类型 |
throw | 手动生成异常对象的关键字 | 方法体中 | 异常对象 |