异常处理
异常是程序在执行过程中所产生的问题。
1.用户的非法操作 2.程序员在编写代码时,糟糕的设计 3.来自于硬件设备的故障
异常的分类:
检查异常:编译期间,编译器能检查出来的错的异常
运行时异常:运行时,抛出的异常。编译器无法检查出来。
错误:错误已经脱离了“异常”的范畴,无法通过修改代码解决问题。如:内存不足、硬盘空间不够、网络问题等。
异常处理
在java中有3种方式:
- 方法本身直接抓捕异常,不让异常对象沿着方法调用栈,继续向下传递。
- 方法抓捕异常并抛出。
- 不抓获异常,让异常对象沿着调用栈,继续向下传递,并抛出。
其中2,3都会使抛出异常的方法,弹出调用栈
方法后:
Throws 关键字,用来给方法的调用者,提前申明:该方法可能会抛出异常
事务:具有明确边界,执行有序的。事务只有成功和失败。
事务中的任何业务方法出现异常,整个事务就是失败的。
事务中的任何业务方法都不能自己抓捕异常,是声明异常,必须外部整体管理。
当方法的调用者,需要知道“调用方法”的具体执行情况,而并非是成功或失败时,有必要针对“调用方法”进行异常声明。比如:Transfer()想知道“张三给李四转钱5000”这个过程中,所有的执行方法具体执行情况时。
在方法异常声明时,如果遇到子异常和父异常都可能抛出的情况,建议声明父异常。原因是父异常可以自动向上转型。
方法异常的声明,通常用于编译异常,而运行时异常,不需要。
在代码中要抛出某个异常,使用throw关键字。
当一个方法中,可能会抛出不计数的异常个数,解决方法如下:
- 定义多个catch块,分别进行代码的监控
- 在catch块的参数类型定义时,直接定义上层父类,采用动态多态的方式来解决问题。
另外需注意的是:
在定义多个Catch块时,定义顺序需遵循从小到大的顺序。(类与子类)
Throwable类
GetMessage和printStackTrace
编译时异常的解决方案:
- 异常处理
- 给方法的调用者进行“异常声明”
运行时异常解决方案:
不需要异常处理,也不需要“异常声明”,让它报错,再通过条件控制语句对其进行控制。
捕获异常
Try{
}catch(Exception e){
}finally{
}
在try中声明的变量,无法在try之外使用。
当Try中的语句发生异常,将执行catch中的代码块。Try中未发生异常,将忽略catch块中内容。当有多个Catch块时,将从上到下依次执行。当一个异常抛出时,与它相匹配的catch块执行。如果没有catch块匹配抛出的异常,那么系统会在堆栈中搜索。无论抛不抛异常,finally都会执行。用于异常捕获过程中收尾的事情。如:关闭链接、清空内存。
Return 无论放在try 还是catch中,Finally始终执行在return之前即finally始终会执行。Return
Final可选修饰符,用于变量、方法、类。
变量会变成常量;方法会变成最终方法,不可重写;类会变成最终类,无法继承。
Finally 常用于异常捕获收尾工作。
Finalize 垃圾回收