一、什么是异常?
异常:程序在运行的过程中发生的错误或问题。
二、异常的分类
1、Error
error表示错误的意思
程序出现错误,程序会崩溃,JVM无法解决,程序无法恢复,只能重启应用。
比如内存溢出(out of memory)错误
2、Exception
Exception是异常的意思。
异常是程序在编译或运行的过程中出现的异常事件,比如:
除数为0的情况,数组下标越界等异常事件。
1)运行时异常
运行时异常(RuntimeException):程序在运行过程中出现的异常,不要求我们做处理。
常见的运行时异常:
(1)ArithmeticException 数学运算异常
(2)NullPointerException 空指针异常
(3)ArrayIndexOutOfBoundsException 数组下标越界异常
(4)ClassCastException 类型转换异常
(5)NumberFormatException 数字格式不正确异常[]
2)编译时异常
编译异常:
在编程的过程中,必须显示处理,否则编译无法通过。
常见的编译异常:
FileNotFoundException (文件找不到)
ClassNotFoundException(类找不到异常)
SQLException(操作数据库时出现的异常)
- 异常的处理
编译异常需要我们处理,那么如何处理呢?
程序员自行处理/抛出异常
1、编程人员自行处理
1)我们所写的程序在编译阶段就告诉我们可能会出现异常,所以我们不确定程序是否能够执行成功,那么我们尝试执行程序。
2)假设程序执行的过程中,出现了异常那么我们就要把这个异常捕获到。
3)有些业务要求无论程序是否出现异常,总之都会做某一些业务操作。
尝试:try
捕获:catch
总之/最后:finally
用法:
try{
//可能发生异常的语句
}catch(Exception e){
//需要捕获的异常,对异常进行处理
}finally{
//无论是否发生异常,总会执行的代码
}
1)异常对象信息的获取
常用的方法主要有两种:
(1)、getMessage() :取得异常描述信息。
(2)、printStackTrace():取得异常的堆栈信息(比较适合于程序调试阶段):;
2)异常处理原理
try{
//可能发生异常的语句
}catch(Exception e){
//需要捕获的异常,对异常进行处理
}finally{
//无论是否发生异常,总会执行的代码
}
异常的处理原理:
1)当try结构中的语句发生异常
2)系统将异常封装成Exception对象 发送给catch
3)编程人员在catch结构中对异常对象进行处理
4)出现异常的语句之后的语句不会执行。
省略finally语句块
try-with-resources
JDK7 之后,Java 新增的 try-with-resource 语法糖来打开资源,并且可以在语句执行完毕后确保每个资源都被自动关闭。
try(InputStream iStream = new FileInputStream("D:/dd.txt")) {
} catch (Exception e) {
}
- 抛出异常
通过throws/throw关键字,将异常抛出,交给调用者处理。
throws 关键字用于在方法声明中指定可能会抛出的异常类型。
throw 关键字用于在代码中抛出异常。
1)throws
throws 关键字用于在方法声明中指定可能会抛出的异常类型。
(1)通过throws关键字,将异常抛出,交给调用者处理。
(2)throws后面的异常类型可以是方法中产生的异常类型,也可是其父类。
2)throw
语法:throw new 异常类型("异常信息");
throw 关键字用于在当前方法中抛出一个异常。
public void checkNumber(int num) {
if (num < 0) {
throw new IllegalArgumentException("数字不能小于0");
}
}
- throw和throws的区别
throw 关键字用于在代码中抛出异常。
throws 关键字用于在方法声明中指定可能会抛出的异常类型。
- 自定义异常
1、为什么要自定义异常?
当程序出现异常的时候,而这个异常信息在Throwable子类(Error/Exception)中没有描述的时候,我们可以自定义异常来描述该错误信息。
2、如何实现自定义异常?
1)自定义异常类
2)继承Exception或RuntimeException
3)自定义“运行时异常”
自定义异常类继承RuntimeException
4)自定义“编译异常”
继承Exception
自定义编译异常需要处理(抛出或者try catch)