目录
一 异常处理机制主要回答了三个问题
What:异常类型回答了什么被抛出;
where:异常堆栈跟踪回答了在哪抛出;
why:异常信息回答了为什么被抛出;
二 异常体系
Throwable: 有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。异常和错误的区别是:异常能被程序本身可以处理,错误是无法处理。
2.1 常见Error及Exception
RuntimeException
非RuntimeException
error
其中NoClassDefFoundError的成因有:
1、类依赖的class或jar不存在(比如在spring中漏掉了某个jar包,没有引入)
2、类文件存在但是在不同的域中(对应的class在classpath中不可用,或者有多个不同的类加载器)
3、大小写问题。javac编译的时候无视大小写。有可能编译出来的class文件与想要的不一样。
三 异常处理机制
在 Java 应用程序中,异常处理机制为:抛出异常,捕捉异常。
抛出异常:当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。
捕捉异常:在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler)。潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,即为合适的异常处理器。运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行。当运行时系统遍历调用栈而未找到合适的异常处理器,则运行时系统终止。同时,意味着Java程序的终止。
3.1 throw和throws
throws:通常被用在声明方法时,用来指定方法可能抛出的异常,多个异常可使用逗号分隔。throws关键字将异常抛给上一级,如果不想处理该异常,可以继续向上抛出,但最终要有能够处理该异常的代码。
例如:
throw:通常用在方法体中或者用来抛出用户自定义异常,并且抛出一个异常对象。程序在执行到throw语句时立即停止,如果要捕捉throw抛出的异常,则必须使用try-catch语句块或者try-catch-finally语句。
例如:
3.2 关于cry-catch-finally:
关于try-catch的性能
设计方法
通过运行可依发现cry-catch满于if-else,原因如下: