异常的概述
异常就是不正常的意思,Java语言中主要指程序在运行阶段产生的错误
Throwable(可抛出、可扔出的)
Java.lang.Throwable类是Java程序所有错误或异常的超类
主要有两个子类:
Error:主要描述比较严重的错误,无法通过编程来解决的重大的错误
Exception:主要描述比较轻量级的错误,可以通过编程来解决的
Throwable中的方法
1. getMessage() - 获取异常信息,返回字符串
2. toString() - 获取异常类名和异常信息,返回字符串
3. printStacTrace() - 获取异常类名和异常信息,以及异常出现在程序中的位置。返回void
4. printStackTrace(PrintStream s) - 通常用该方法将异常内容保存在日志文件中,以便查阅
Exception类的主要分类
RuntimeException -运行时异常,也叫做非检测性异常类
ArithmeticException - 算数异常类
ArrayIndexOutOfBoundsException(间接子类) - 数组下标越界异常
NullPointerException - 空指针异常
ClassCastException - 类型转换异常
NumberFormatException(间接子类) - 数字格式异常
注 意 :
当程序的执行过程中产生异常,若没有手动进行处理 则有java虚拟机采用默认的方式处理,默认方式就是打印异常名称、异常原因以及异常发生的位置并终止,后续的代码无法被执行
运行时异常的处理方式
对于绝大对数运行时异常来说,都可以通过判断条件来避免异常的发送
异常的捕获
(1)语法格式
try{
可能产生异常对象的语句块;
}catch(异常类型 引用名){
针对当前异常类型对象捕获异常的结构中有多个catch分支时,切记小范围的异常类型放在大范围的异常类型上面的处理语句块;
}
finally{
无论是否发生异常都应执行的语句块;
}
(2)注意事项
捕获异常的结构中有多个catch分支时,切记小范围的异常类型放在大范围的异常类型上面
懒人的写法:
catch(Exception e){...}
(3)执行流程
try{
a;
b;
c;
}catch(Exception e){
e;
}finally{
f;
}
h;
当没有产生异常的时候,程序的执行流程是:a b c f
当产生异常时,执行的流程是:a b e f
异常的抛出
(1)基本概念
在某些特殊的场合中,当产生异常后却无法直接处理的/不想处理时,此时就可以将异常转移给当前方法的调用者,这都叫异常的抛出
(2)语法格式
返回值 方法名称(形参列表) throws 异常类型(......)
(3)方法重写的原则
1. 要求方法名相同、参数列表相同、返回值类型相同,从jdk1.5开始允许返回子类类型
2. 访问权限不能变小,可以相同或者变大
3. 不能抛出更大的异常
注 意 :
子类中重写以后的方法可以选择抛出与父类一样的异常、更小的异常,但是不能抛出更大的异常、不同的异常
自定义异常
(1)自定义异常的由来
Java官方库中虽然提供了大量的异常类,但不足以描述显示生活中所有的异常情况,当出现官方文档中没有描述的异常情况时就需要程序员自定义异常类加入描述,使得异常信息更加具备针对性和可读性
(2)自定义异常的流程
1. 自定义类继承Exception类或者Exception类的子类
2. 提供两个版本的构造方法,一个是无参构造的方法,另一个是字符串做参数的构造方法
异常对象的抛出
throw new 异常类型()
例如:
throw new Exception()
throws和throw的区别:
throws
1. 用在方法声明后面,跟的是异常类名
2. 可以跟多个异常类名,用逗号隔开
3. 表示抛出异常,由该方法的调用者来处理
4. throws表示出现异常的一种可能性,并不一定会发生这些异常
throw
1. 用在方法体内,跟的是异常对象名
2. 只能抛出一个异常对象名
3. 表示抛出异常,由方法体内的语句处理
4. throw则是抛出了异常,执行throw则一定抛出了某种异常
finally的特点作用及面试题
finally的特点
1. 被finally控制的语句体一定会执行
2. 特殊情况: 在执行到finally之前jvm退出了(比如System.exit(0))
finally的作用
1. 用于释放资源,在IO流操作和数据库操作用会见到
finally相关的面试题
1. final,finally和finalize的区别
2. 如果catch里面有return语句,请问finally的代码还会执行吗?
3. 如果会,请问是return前还是return后