异常处理:
一:异常:
程序在运行过程中出现的不正常的现象
二:分类:
异常和错误的区别:异常是程序员能够处理的情况,而错误一般是硬件,运行环境设计等原因导致的,程序员不能去处理的情况
运行时异常和编译时异常的区别:一般来说,运行时异常为语义错误,而编译时异常为语法错误,连编译都无法通过;
三:异常处理 ——抓住异常
1.三个主要的关键字:
try(程序块中可能有异常) -> catch(如果有异常,那么进入到catch中处理) -> finally
try:包含可能产生异常的块,必须书写;
catch:异常处理块(可有多个,也可以一个catch匹配多种异常类型;注意语法);先与tay中产生的异常进行匹配,若匹配成功,则进入执行;
finally:finally块不管异常是否发生,只要对应的try执行了,则它一定也执行(即使在catch中有return 也会执行)。(值得注意:当catch中有return语句,finally语句中也有return语句,则catch中的return会被覆盖,故finally语句中不应该有return语句,)只有一种方法让finally块不执行:System.exit()(//关闭虚拟机);因此finally块通常用来做资源释放操作:关闭文件,关闭数据库连接等等。
注意区别:
final:方法修饰符
finall:异常处理的关键字
finalize:它是Objec的一个方法(垃圾回收时调用)
2.处理步骤:
情况一:有了try-catch处理,程序在运行过程中,出现了异常,并在处理时产生的异常和catch的异常匹配,进入catch处理,异常处理结束;
情况二:有了try-catch处理,程序在运行过程中,没有出现了异常,不进入catch处理,异常处理结束;
情况三:有了try-catch处理,程序在运行过程中,出现了异常,但和catch匹配失败,程序终止运行;
情况四:有了try-catch处理,并有多个catch处理块,程序在运行过程中,出现了异常,和catch自顶向下依次匹配,若匹配成功,则执行,异常处理成功,若全部匹配失败,程序终止运行;
情况五:finall块不管发生什么情况都会执行
注意事项:
异常处理代码的书写顺序:Try->catch->finally
Try为可能产生异常的块,必须书写
catch为处理异常的块,必须书写,可以有1~N个
finally可写可不写
如果有多个catch块,必须按先子类后父类的顺序书写,否则报错;
常见异常:
java.long.ArithmeticException 数异常
java.long.ArrayIndexOutOfBoundsException 数组越界
java.long.IllegalArgumtException 方法的参数错误
ClassCastException 类型强制转换错误
java.long.NumberFormatException
FileNotFoundException 文件未找到异常
SQlException 操作数据库异常
IOException 输入输出异常
总结:
一:
finally可以没有,也可以只有一个。无论有没有发生异常,它总会在这个异常处理结构的最后运行。
即使你在try块内用return返回了,在返回前,finally总是要执行,这以便让你有机会能够在异常处理最后做一些清理工作。
如关闭数据库连接等等。
注意:如果没有catch语句块,那么finally块就是必须的。
二
1、不管try,finally都会执行;
2、在try中return,在finally执行前会把结果保存起来,即使在finally中有修改也以try中保存的值为准,但如果是引用类型,修改的属性会以finally修改后的为准;
3、如果try/finally都有return,直接返回finally中的return。
三
1、不管有没有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,
管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
四:异常处理——抛出异常
通过throw语句手动显式的抛出一个异常
步骤:在方法声明时,用 throws 异常类型 先声明可能要抛出异常;
可用try产生异常,用catch处理时用 throw 异常对象 抛出异常;
在主调函数中用try接收,catch处理,可再次抛出,或常规处理;
五:自定义异常
如果要自定义异常类,则扩展Exception类即可,因此这样的自定义异常都属于检查异常(checked exception)。如果要自定义非检查异常,则扩展自RuntimeException。
方法:
e.printStackTrace(); //打出错误的堆栈信息