Exception 的作用,这个问题是一个开放性的问题,没有规范的答案,不同经验的人可能会有不同的答案,后续的陈说这代表我集体的意见,不肯定正确,但有肯定的参考性。
- Exception,顾名思义,代表着程序运行的过程中呈现一种不失常的状态,须要停止运行,同时又能疾速的发现程序为什么会呈现错,通过异样的信息可能疾速定位,所以异样要尽可能多的提供刹时的状态信息,尤其是利用零碎本身抛出的异样,须要将上下文状态尽可能多的输入,有助于排查和定位。
- Exception 也是一种程序逻辑管制的形式,是程序健壮性的一种体现。其实,大都数异样,程序都应该有肯定的相应的解决逻辑,例如,FileNotFoundException, ArrayIndexOutOfBoundsException 等,这类异样在编码过程中应该可能预感,并须要做呈现相应的逻辑管制,有教训的程序员,在编码的过程中就曾经思考到各种异样的状况,待整个零碎上线后,呈现的问题绝对较少,而一般的程序员往往只保障程序在 Happy Case 时可能失常运行,却疏忽了各种异常情况,往往是在呈现问题后进行补救,导致程序在重复补救后,逻辑凌乱,这也就是很多我的项目晚期的代码品质高,通过一段时间后,代码惨不忍睹的本源。
- 什么时候须要 Cache Exception,什么时候须要 Throw 呢?这也是不会有标准答案的过程,Java 自身也没有给出标准答案,也没有领导准则。但通过无数次实际的教训后,你就能领会异样的重要性,往往呈现很诡异的 Bug 时,同时可参考的日志或其它信息时,在要害的地位异样被人为的暗藏是如许愚昧的行为。我在应用一个开源的框架时,时常会发现重要的异样信息被暗藏,导致破费大量的工夫去跟踪代码。通过下面的形容,也就不难看出,异样在什么时候须要 Throw,什么时候须要 Catch,准则其实很简略:1)异样在可能齐全掌控的状况下,而且也有明确的逻辑解决时,须要 Catch,同时,也须要关注内部程序是否须要感知异样,如果须要,则封装新的异样后从新 Throw;2)无奈决定解决逻辑的状况下,须要将所有异样 Throw,让内部程序决定解决逻辑。
- 什么时候定义 Exception 同样是没有任何领导准则,只能凭本身的教训判断,依据我集体的教训的准则是:1)须要内部程序对异常情况有明确解决状况时,须要定 c 义异样,以便内部程序可能明确辨认;2)外部程序处理过程中呈现太多异样,并且这类异样具备独特的个性 (例如:ClassNotFountException, NoSuchMehtodException 等),不须要内部程序对这类异样别离解决时,须要定义异样。
- Exception 和 RuntimeException 有什么区别,在什么场景下定义,也是一个仁者见仁,智者见智的问题,Java 没有任何领导倡议,按我集体的判断很多的定义也不是特地正当,例如:IndexOutOfBoundsException 应该是一个 Exception JDK 即定义为 RuntimeExcption 这类谬误须要明确的揭示内部程序对数组进行逻辑限度,也是利用零碎在经常出现谬误后,能力被动 Cache 这类异样;然而像 ClassNotFoundException 这类异样在极少数状态下才会进行逻辑解决 JDK 却定义为 Exception 导致很多反射类的我的项目的解决逻辑变得复杂,NullPointerException 也是经常出现的,但定义为 RuntimeException 是正当的,因为 JDK 从逻辑根本无法捕获 NullPointerException,应该是在 JVM 执行过程中才可能进行逻辑判断,具体并未钻研。通过下面的两个示例也很容易看出 Exception 和 RuntimeException 有什么区别,JDK 的设计应该从内部程序应用的角度进行异样设计,因为内部程序导致的异样,并且内部程序该当有逻辑解决异样状态,这类异样理当定义为 Exception,而其它因为 JVM 在编码期无奈判断,也无奈从语法层面提供解释的 Exception 应该定义为 RuntimeException。
针对 Java 异样的解读是我集体的见解,就像古诗词一样,不同人有不同的解读,置信 JDK 的设计者也无奈给 Java Exception 一个明确的解释和准则,只能靠历史的积攒,逐造成绝对残缺的了解,供前人学习。