本周介绍了异常以及异常的处理。Java的异常机制将处理异常的代码整合到一个代码块中,而不是通过if-else进行处理,提高了代码整体的简洁性。同时,异常机制可以更加详细地说明错误类型、引起错误的位置、错误信息,对程序健壮性十分有帮助。
异常
1.Java“异常”的分类
分为Error和Exception(又分为RuntimeException和其它Exception),其中虚线部分(unchecked exception)不需显式catch。
2.运行时异常由程序员在代码中处理不当造成,其它异常由外部原因造成。
3.运行时异常不应该catch,而是通过修改代码消除。其它异常需要catch,如果不捕获则编译无法通过,类似于静态类型检查。
4.异常是为了增强程序健壮性;断言为了增强程序正确性。
处理异常(针对checked exception)
1.当要决定采用checked exception还是unchecked exception时,看异常由谁引起的。如果客户端代码不能做任何补救措施,则采用uncheck exception;如果客户端可以根据异常信息补救,则采用checked exception。
2.客户端应该从checked exception中获取有价值的信息,利用异常返回的信息明确操作失败的原因。
3.checked exception是可预料但无法预防的。如果做不到这一点则使用unchecked exception。
4.两种异常的对比
5.方法应该throws的异常种类:该方法调用的其它方法抛出了一个checked exception(从别处传来的异常);当前方法检测到错误并使用throw抛出一个checked exception(本身造成的异常)
6.捕获异常时,按照从具体到宽泛的顺序编写catch块
7.可以在catch块中继续抛出异常(为了细化异常种类),但是需要保留根异常
LSP原则下的异常
核心是子类型可以替代父类型,即声明父类型,赋值子类型
1.如果子类型重写了父类型的方法,那么子类型方法抛出的异常不能比父类型抛出异常的类型更宽泛。
2.子类型方法可以抛出更具体的异常,也可以不抛出异常。
3.如果父类型的方法未抛出异常,子类型方法也不能抛出异常。可以理解成未抛出异常是最具体的异常。