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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值