在Java中,一般异常有两种实现模型,一种是(Checked Exception)受控异常;另一种是(Runtime Exception)非受控异常。受控异常,是指那些需要在客户显式捕获、处理或抛出的异常,它们继承自java.lang.Exception;运行时异常,是指不需要客户显式捕获、处理或抛出的异常,它们继承自Java.lang.RuntimeException。
使用运行时异常可以有效避免“污染”用户,如果采用受控异常,在处理一些接口时就会抛出底层的远程通信异常,它会强迫客户捕获并处理,如果客户不处理继续往上层的调用端抛出,如所有的异常都往上抛,那么Web层的WebController就要去处理这些异常,达到了污染的目的。
在.NET中,我们也遇到过异常,那时我们都是采用受控异常,在调试期间就不得不把所有的异常去除掉,造成了很大的复杂性,如果使用运行时异常,则可以大大减少这些错误。在程序中,我们应尽可能的采用运行时异常,而少用受控异常。
受控异常:Checked Exception,这类异常必须写try{}catch{},或者throw抛出,否则编译通不过。
非受控异常:Unchecked Exception,这类异常也叫做运行时异常(与非受控异常 字数相等),这类异常不需要try{}catch{},也不需要throw抛出,编译能通过。为什么要使用非受控异常?为了简化代码。试想一下,如果所有可能出现异常的地方(比如访问数组元素可能会越界、调用对象方法,对象可能为null),我们都写try{}catch{},或者throw 抛出,那么代码肯定冗余的不成样子了。也就是说,采用非受控异常(运行时异常)可以减少代码的污染。
对于非受控异常(运行时异常),因为不需要额外处理,也能编译通过,我们可以进行预先检查,比如访问数组元素时,我们预先检查是否越界,调用对象方法时,预先检查对象是否为null