java异常知识点梳理

本文主要是整理了effective java中关于异常的几点说明

一,异常链
在捕获异常后抛出另一个异常,并且把原始的异常信息保存下来,这被称为异常链。
所有Throwable的子类在构造器中都可以接受一个cause对象作为参数。这个cause就用来表示原始异常,这样通过把原始异常传递给新的异常,使得在当前位置创建并抛出了新的异常,也能通过这个异常链追踪到异常最初发生的位置。
在Throwable的子类中,只有三种基本的异常类提供了带cause参数的构造器。它们是Error,Exception,以及RuntimeException.如果要把其他类型的异常链接起来,应该使用initcause()方法而不是构造器。
如果低层的异常对于调试高层异常的问题非常有帮助,那么使用异常链就很合适。如下为effective java中的一个例子。

低层的异常被传递到高层的异常。

try{
.......
}catch(LowerLevelException cause){
    throw new HighLevelException(cause);
}

高层异常的构造器将原因传到支持链的超级构造器。

class HighLevelException extends Exception{
    HighLevelException (Throwable cause){
       super(cause);
    }
}

二,常用标准异常
1,IllegalArgumentException 当调用者传递的参数值不合适的时候,往往就会抛出这个异常。
2,IllegalStateException 如果因为接收对象的状态而使调用非法,通常就会抛出这个异常。例如,如果某个对象在被正确地初始化前,调用者就企图调用这个对象,就会抛出这个异常。
3,ConcurrentModificationException 在禁止并发修改的情况下,检测到对象的并发修改。
4,UnsupportedOperationException 如果对象不支持所请求的操作,就会抛出这个异常。
三,努力使失败保持原子性
一般而言,失败的方法调用应该使对象保持在被调用之前的状态。具有这种属性的方法被称为具有失败原子性。
有几种途径可以实现这种效果。
1,设计一个不可变的对象。如果对象是不可变的,失败原子性是显然的。
2,对于可变对象,在执行操作之前检查参数的有效性。
3,调整计算处理过程的顺序,使得任何可能会失败的计算部分都在对象状态被修改之前发生。
四,避免不必要地使用受检的异常
受检的异常强迫程序员处理异常的条件。如果一个方法抛出一个或者多个受检的异常,调用该方法的代码就必须在一个或者多个catch块中处理这些异常。或者它必须声明它抛出这些异常。这给程序员增添了很大的负担。
如果正确地使用API并不能阻止这种异常条件的产生,并且一旦产生异常,使用API的程序员可以立即采取有用的动作,这种负担就被认为是正当的。否则就适合使用未受检的异常。
把受检的异常变长未受检的异常的一种做法是,把这个方法分为两个方法,其中第一个方法返回boolean,表明是否应该抛出该异常。
五,补充
1,永远不要声明一个方法"throws Exception",因为它实际上掩盖了该方法在同样的执行环境下可能抛出的任何其他异常。

你可能感兴趣的:(java基础)