Throwable |
Exception |
Error |
RuntimeException |
ClassNotFoundException |
IOException |
SQLException |
IndexOutOfBoundsException |
ClassCastException |
NullPointerException |
OutOfMemoryError |
StackOverflowError |
NoClassDefFoundError |
Java采用违例(Exception)处理机制来进行错误处理。 违例机制的一个好处就是能够简化错误控制代码, 我们再也不用检查一个特定的错误, 然后在程序的多处地方对其进行控制。 此外, 也不需要在方法调用的时候检查错误(因为保证有人能够捕获这里的错误)。 我们只需要在一个地方处理问题:”违例控制模块”或者”违例控制器”。 这样可有效减少代码量, 并将那些用于描述具体操作的代码与专门纠正错误的代码分隔开。
一个完整的违例例子:
public void throwTest() throws MyException {
try {
...
} catch (SQLException se) {
cat.error("", se);
throw new MyException(se.getMessage());
} catch (Exception e) {cat.error("", e);
} finally {
...
}
}
如果一段代码有可能会抛出违例可以用try {} catch {}来处理。 被catch到的违例可以再抛出, 也可以转换为其它类型的Exception抛出。 finally块里面的代码总会被执行到的, 不管前面是否已经throw或return了。
Throwable是所有违例的基类, 它有两种常规类型。 其中, Error代表编绎期和系统错误, 我们一般不必特意捕获它们。 Exception是可以从任何标准Java库的类方法中掷出的基本类型。
看上面的图, 如果是Error的子类或是RuntimeException的子类这种违例有一定的特殊性, 可以说我们可以当它们不存在, 当这种违例抛出的时候, 我们可以不catch它, 也可以不在方法上throws它。 RuntimeException一般代表的是一个编程错误, 是完全可以避免的。
性能注意点: 因为使用了Exception之后是要影响一些效率的, 所以Exception不能滥用。一般的不要用Exception来控制业务流程, 其次不要循环体内使用。
技巧:我们可以从Exception或直接从Throwable继承写我们自己的Exception, 然后根据业务需要抛不同种类的Exception。