java中的Error 与 Exception
1. 综述
java中有java.lang.Throwable,以及其子类 java.lang.Exception和java.lang.Error
Error:描述内部系统错误或资源枯竭的状态。(例如VirtualMachineError,
LinkageError)程序员通常对此无能为力,一旦发生,想办法令其优雅地结束
Exception:自己程序导致的问题,可以捕获,进行处理
下面着重介绍异常处理。
2. Exception Handling
(1) 异常:程序执行中的非正常事件,程序无法再按预想的流程执行
将错误信息传递给上层调用者,并报告“案发现场”的信息
方法throws一个封装异常信息的类(即异常类)
方法立即终止,且不返回任何值
而且,执行并不重返调用该方法的代码处,而是找异常处理程序,
如果找不到异常处理程序,整个系统完全退出。
使用try-catch语句进行捕获处理。
(2)checked和unchecked异常
java中继承自Throwable的类:
Exception主要分两类:RuntimeException和其他Exception
先介绍RuntimeException:
即运行时的异常,运行异常是由程序员编程时处理不当造成的,
而其他异常是由外部原因造成的。
如果存在RuntimeException:是程序员的错误,程序员能对其进行修改。
若存在非运行时异常,是程序员无法完全控制的外在问题所导致的
a. 对于RuntimeException和Errors,编译器无法进行检查,因此为Unchecked
Exceptions。
Error发生时无能为力,而RuntimeException出现意味着你要重新代码修复错误,
而不是对这种错误进行捕获和处理。
b. 对于除了RuntimeException之外的Exception,编译器会提醒你对其进行处理或
声明处理不了。
若自建Exception类,当从RuntimeException派生时,可以不处理,编译器也不提醒,但
执行时出现就会导致失败,类似于动态类型检查。
若从Exception类中派生子类型,则必须捕获并指定错误处理器handler,否则无法通过编
译,类似于静态类型检查。
(3)对异常的处理
五个关键字:
try,catch,finally,throws,throw
throws 声明异常
throw 抛出异常
try catch finally 捕获并处理异常
(a)尽量使用unchecked exception来处理编程错误的情况:
如果client端对某种异常无能为力,可以把它转变 为一个unchecked exception,程序被
挂起并返回 客户端异常信息
(b)错误可预料,但无法预防,但可以有手段从中恢复,此时使用checked exception
unchecked与checked对比:
a. throws:
“异常”也是方法和 client端之间spec的一部分,在post-condition中刻画
LSP:
如果子类型中override了父类型中的函数,那么子类型中方法抛出的异常不能比父类型抛出的异常类型更广泛 。
子类型方法可以抛出更具体的异常,也可以不抛出任何异常
未完待续。