简介
指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。
在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。Java处理异常的方式是中断处理。
异常指的并不是语法错误,语法错了,编译不通过,不会产生字节码文件,根本不能运行。
异常结构
异常分类
Throwable
Throwable分为Error和Exception两类。
- Error
是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java 虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现OutOfMemoryError。这些异常发生时,Java 虚拟机(JVM)一般会选择线程终止。
这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java 虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之 外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。
- Exception
是程序本身可以处理的异常,异常产生后程序员可以通过代码的方式纠正,使程序继续运行,是必须要处理的。
Exception
Exception分为RuntimeException(运行时异常)和编译时异常(暂用CheckedException代表,本身不存在该CheckedException类)。
- RuntimeException
运行时期异常 在运行时期,检查异常.在编译时期,运行异常不会让编译器检测(不报错)(如空指针异常)。即代码可以不做任何处理。
- CheckedException
此类不存在,是Exception下除RuntimeException剩余的异常,如IOException,SQLException,在编译时期,就会检查,如果没有处理异常,则编译失败。即代码必须做处理,方可进行编译。
异常处理机制
在 Java 应用程序中,异常处理机制为:抛出异常,捕捉异常。
- 抛出异常
当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。
- 捕获异常
在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler)。潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,即为合适 的异常处理器。运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行。当运行时系统遍历调用栈而未找到合适 的异常处理器,则运行时系统终止。
异常处理原则
- 重新抛出的异常必须保留原来的异常,即throw new NewException("message", e), 而不能写成throw new NewException("message"),保证异常栈轨迹不被忽略;
- 在所有异常被捕获且没有重新抛出的地方必须打印日志;
- 如果属于异常的空异常处理块必须注释说明原因,否则不允许空的catch块;
- 框架尽量捕获低级异常,并封装成高级异常重新抛出,隐藏低级异常的细节;
- 不允许用e.printStackTrace()打印异常,因为这样会输出到控制台而且没有备份,没有类信息,没有基本难以使用,正确做法是统一交给日志框架处理;
- 优先使用标准异常,使用标准异常能够一目了然知道什么错误,如Java提供的IllegalArgumentException,UnsupportedOperationException等;
- 尽量捕获特定异常而不是捕获Exception,这样才能够针对特定异常做特定处理;
- 尽量捕获特定异常代码而不是一个try-catch包含了所有代码。
参考
https://blog.csdn.net/qq_29229567/article/details/80773970;
https://www.zhihu.com/question/352295705