细品Java中的异常体系

Java中的异常

异常的基本定义:

  1. 异常情形是指阻止当前方法或者作用域继续执行的问题。
  2. 异常处理机制就是当程序发生异常时,它强制终止程序运行,记录异常信息并将这些信息反馈给我们,由我们来确定是否处理异常。

异常体系

1. Java中的异常
  • Throwable是java语言中所有错误和异常的超类(万物即可抛)。它有两个子类:Error、Exception。
  • Exception 和 Error 体现了 Java 平台设计者对不同异常情况的分类。
  • Exception 是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。
2. Exception的两个类型
  1. RuntimeException不可检查异常,如 NullPointerException ,ArrayIndexOutOfBoundsException。还有Erro也是不可检查异常(OutOfMemoryError等)
  2. 除了Error 和 RuntimeException的其它异常。javac强制要求程序员为这样的异常做预备处理工作(使用try…catch…finally或者throws)。在方法中要么用try-catch语句捕获它并处理,要么用throws子句声明抛出它,否则编译不会通过。
  3. 检查异常再描述Java的设计者设计了检查性异常(Checked exceptions)。当方法引发“检查性异常”时,“检查性异常”将成为方法符号的一部分。例如:如果方法抛出了IOException ,我们必须显式地使用方法符号(在Java中是try…catch),如果不这样做的话将会导致编译时错误(compile-time error)(来源WIKI)
3. Java异常类和接口集合(如下图)

在这里插入图片描述

异常捕获的原则

4. 异常捕获规则
  1. 尽量不要捕获类似 Exception 这样的通用异常,而是应该捕获特定异常。
    • 意义在于代码更易懂,捕获异常的目的不是说只要有异常我就捕获然后就处理,但是在特殊情况下其中一些异常我们是不需要处理的。有时候我们也希望异常可以被扩散出去。在平时开发,
    • 我们都是将异常直接吞掉然后打印异常日志。再返回一个异常的值给client。这种方式其实你把异常捕获且处理了这也是没有问题的。写完代码后也不知道会发生那些异常,直接就Exception e进行捕获处理了。这是不专业的一种表现,且使用了Trycatch()的代码会在变异阶段加上指令,如果没有异常程序性能不会减少很多但是如是有异常然后处理,就会很浪费性能的。所以还是尽量少用trycatch 将其异常进行向上抛出,最后全局捕获。
  2. 不使用e.printStackTrace()进行异常捕获。
    • printStackTrace()默认使用了System.err输出流进行输出,与System.out是两个不同的输出流,那么在打印时自然就形成了交叉。再就是输出流是有缓冲区的,所以对于什么时候具体输出也形成了随机。
  3. 遵循 Throw early, catch late
    • 早扔晚抓。早扔的意思就是遇到一场立马抛出,看到异常我们立马就能清晰判断是哪里的问题。如下面的代码
    public void readPreferences(String fileName){
       //...perform operations... 
      InputStream in = new FileInputStream(fileName);
       //...read the preferences file...
    }
    
    
    public void readPreferences(String fileName){
       //...perform operations... 
      InputStream in = new FileInputStream(fileName);
       //...read the preferences file...
    }
    
    晚抓也就是进行处理异常。使用严谨的异常处理逻辑进行重新组装,进行提示clinet,和开发人员

总结

  1. Java中异常的定义
  2. Java中的Erro和Exceoption
  3. Erro和Except和Exception中的RuntimeException是不可检查异常。之外的都是可检查异常必须进行显示捕获操作才不会发生编译错误
  4. 使用try{}catch()进行异常捕获的时候会产生快照,在基础服务和系统中不可忽略。
  5. 捕获异常的集中套路:捕获具体的异常,不生吞异常,不适用e.printStatck()打印异常,遵循Throw early, catch late

参考

  1. https://time.geekbang.org/column/article/6849
  2. https://blog.csdn.net/pyd950812/article/details/103717212
  3. https://zhuanlan.zhihu.com/p/93836930
  4. https://zh.wikipedia.org/wiki/%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值