Java异常处理

Unchecked & Checked Exception

  • RuntimeException及其子类是Unchecked Exception:
    随时可以抛出,编译器不强制捕获。如IllegalArgumentException、ClassCastException、ArrayIndexOutOfBoundsException、NullPointerException等。
  • 其他Exception是Checked Exception:
    函数定义中必须声明throws,调用方必须处理,或throws或try catch。如IOException、InterruptedException、ParseException等。

处理异常

Unchecked Exception不需要处理,这里只讨论Checked Exception的处理方案。

  • 如何处理异常
    try catch后,写日志,执行相关逻辑。
  • 如何不处理异常
    在更高层面,因为有了清晰的(业务)逻辑,往往会更清楚合适的的处理方式是什么。所以可以暂不处理异常,继续抛出。如果能,添加throws定义。否则将Checked Exception转化成Unchecked Exception,在抛出。转化时必须带上Cause:throw new RuntimeException(checkedException);
  • 特别注意
    尽量不要捕获类似 Exception 这样的通用异常,而是应该捕获特定异常。
    不要生吞异常。如果没有把异常抛出来,也没有输出到日志(Logger),程序可能在后续代码以不可控的方式结束。
    除demo外,不能使用e.printStackTrace();输出异常,应该使用日志。

性能分析

  • try-catch 代码段会产生额外的性能开销,或者换个角度说,它往往会影响 JVM 对代码进行优化,所以建议仅捕获有必要的代码段,尽量不要一个大的 try 包住整段的代码;与此同时,利用异常控制代码流程,也不是一个好主意,远比我们通常意义上的条件语句(if/else、switch)要低效。
  • Java 每实例化一个 Exception,都会对当时的栈栈进行快照,这是一个相对比较重的操作。如果发生的非常频繁,这个开销就不能被忽略了。

参考文献
https://time.geekbang.org/column/intro/82

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章