Java中的异常
异常的基本定义:
- 异常情形是指阻止当前方法或者作用域继续执行的问题。
- 异常处理机制就是当程序发生异常时,它强制终止程序运行,记录异常信息并将这些信息反馈给我们,由我们来确定是否处理异常。
异常体系
1. Java中的异常
- Throwable是java语言中所有错误和异常的超类(万物即可抛)。它有两个子类:Error、Exception。
- Exception 和 Error 体现了 Java 平台设计者对不同异常情况的分类。
- Exception 是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。
2. Exception的两个类型
- RuntimeException不可检查异常,如 NullPointerException ,ArrayIndexOutOfBoundsException。还有Erro也是不可检查异常(OutOfMemoryError等)
- 除了Error 和 RuntimeException的其它异常。javac强制要求程序员为这样的异常做预备处理工作(使用try…catch…finally或者throws)。在方法中要么用try-catch语句捕获它并处理,要么用throws子句声明抛出它,否则编译不会通过。
- 检查异常再描述: Java的设计者设计了检查性异常(Checked exceptions)。当方法引发“检查性异常”时,“检查性异常”将成为方法符号的一部分。例如:如果方法抛出了IOException ,我们必须显式地使用方法符号(在Java中是try…catch),如果不这样做的话将会导致编译时错误(compile-time error)(来源WIKI)。
3. Java异常类和接口集合(如下图)
异常捕获的原则
4. 异常捕获规则
尽量不要捕获类似 Exception 这样的通用异常
- 意义在于代码更易懂,捕获异常的目的不是说只要有异常我就捕获然后就处理,但是在特殊情况下其中一些异常我们是不需要处理的。有时候我们也希望异常可以被扩散出去。在平时开发,
- 我们都是将异常直接吞掉然后打印异常日志。再返回一个异常的值给client。这种方式其实你把异常捕获且处理了这也是没有问题的。写完代码后也不知道会发生那些异常,直接就Exception e进行捕获处理了。这是不专业的一种表现,且使用了Trycatch()的代码会在变异阶段加上指令,如果没有异常程序性能不会减少很多但是如是有异常然后处理,就会很浪费性能的。所以还是尽量少用trycatch 将其异常进行向上抛出,最后全局捕获。
不使用e.printStackTrace()进行异常捕获。
遵循 晚抓也就是进行处理异常。使用严谨的异常处理逻辑进行重新组装,进行提示clinet,和开发人员
总结
- Java中异常的定义
- Java中的Erro和Exceoption
- Erro和Except和Exception中的RuntimeException是不可检查异常。之外的都是可检查异常必须进行显示捕获操作才不会发生编译错误
- 使用try{}catch()进行异常捕获的时候会产生快照,在基础服务和系统中不可忽略。
- 捕获异常的集中套路:捕获具体的异常,不生吞异常,不适用e.printStatck()打印异常,遵循Throw early, catch late
参考
- https://time.geekbang.org/column/article/6849
- https://blog.csdn.net/pyd950812/article/details/103717212
- https://zhuanlan.zhihu.com/p/93836930
- https://zh.wikipedia.org/wiki/%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86