一,概念
异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序
二,异常处理:
Java编程语言使用异常处理机制为程序提供了错误处理的能力
三,Java的异常处理是通过5个关键字来实现的:
1.try 执行可能产生异常的代码
2.catch 捕获异常
3.finally 无论是否发生异常,代码总能执行
4.throws 声明方法可能要抛出的各种异常
5.throw 手动抛出异常
四,try- catch块
第一种情况:try块中所有语句正常执行完毕,不会发生异常,那么catch块中的所有语句都会被忽略。
public void method(){
try {
// 代码段(此处不会产生异常)
} catch (异常类型 ex) {
// 对异常进行处理的代码段
}
// 代码段
}
第二种情况:try语句块在执行中遇到异常,那么在try块中其剩下的代码都将被忽略,系统会自动生成相应的异常对象,如果这个异常对象与catch中声明的异常类型相匹配,则相应的catch块将会被执行
public void method(){
try {
// 代码段 1
// 产生异常的代码段 2
// 代码段 3
} catch (异常类型 ex) {
// 对异常进行处理的代码段4
}
// 代码段5
}
第三种情况:try语句块在执行中遇到异常,如果这个异常与catch中声明的异常类型不匹配,程序会中断。
五,在catch块中处理异常
void printStackTrace() 输出异常的堆栈信息
String getMessage() 返回异常信息描述字符串,是printStackTrace()输出信息的一部分
六,常见的异常类型
七,多重catch块
一段代码可能会引发多种类型的异常,在上面计算并输出商的示例中,其实至少存在两种异常情况,输入非整数内容和除数为0,而我们统一按照Exception类型捕获。
如果要分别捕获,就可以使用多重catch块。
八:引发多种类型的异常
(1)排列catch 语句的顺序:先子类后父类
(2)发生异常时按顺序逐个匹配
(3)只执行第一个与异常类型匹配的catch语句
九,try-catch-finally
public void method(){
try {
// 代码段 1
// 产生异常的代码段 2
} catch (异常类型 ex) {
// 对异常进行处理的代码段3
return;
}finally{
// 代码段 4
}
}
十,声明异常
main方法声明的异常由Java虚拟机处理
十一,抛出异常 throw
除了系统自动抛出异常外,在编程过程中,我们往往遇到这样的情形:有些问题是系统无法自动发现并解决的,如年龄不在正常范围内、性别输入不是“男”或“女”等,此时需要程序员而不是系统来自行抛出异常,把问题提交给调用者去解决。
Java语言中通过关键字throw来自行抛出异常。
十二,自定义异常
当JDK 中的异常类型不能满足程序的需要时,可以自定义异常类。
使用自定义异常的步骤:
十三,异常处理原则
异常处理与性能
异常只能用于非正常情况
不要将过于庞大的代码块放在try中
在catch中指定具体的异常类型
需要对捕获的异常做处理
十四,面试题:
1.try-catch块中存在return语句,是否还执行finally块,如果执行,说出执行顺序?
(1)不管有没有出现异常,finally块中代码都会执行;
(2)当try和catch中有return时,finally仍然会执行;
(3)finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
(4)finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
2.try-catch- finally块中, finally块唯一不执行的情况是什么?
答:关闭虚拟机
3.请说出throw和throws的区别?
(1)作用不同: throw用于在程序中抛出异常; throws用于声明在该方法内抛出了异常。
(2)使用的位置不同:throw位于方法体内部,可以作为单独语句使用; throws必须跟在方法参数列表后面,不能单独使用。
(3)内容不同: throw抛出一个异常对象,而且只能是一个;throws后面跟异常类,而且可以跟多个异常类。
4.Error与Exception的区别
答:都继承与Therowable这个类
Error是java程序在编译阶段出现的问题,代码将无法通过编译
Excepetion是java程序运行阶段是才出现的问题,能通过编译,但是不能完整运行
十五,总结