java异常
java的异常处理机制主要回答了三个问题:
- What: 即异常类型,回答了什么异常类型会被抛出.
- Where: 即异常堆栈跟踪,回答了在哪儿抛出的异常.
- Why: 即异常信息,回答了为什么会抛出该异常.
java的异常体系
由图可知:
Throwable是java异常体系的顶层父类
,它有两个子类,分别是Error类
和Exception类
.
而Exception类又包括了RuntimeException
这个运行时异常和其他的编译期异常.
RuntimeException: 表示运行时异常,是不可预知的,不过写程序可以自行避免,例如数组下标越界等.
非RuntimeException: 可预知的,从编译器校验的异常,这也是必须处理的异常
,不处理程序不执行,如IOException等.
其中,可检查异常就是非运行时异常,也就是编译期异常,不能直接抛出,必须处理才能编译通过,如下图中的文件无法找到异常
Error和Exception的区别
- Error: 指的是程序无法处理的系统错误,编译器不做检查,一般是跟jvm相关的问题.
- Exception: 程序可以处理的异常,捕获后可能可以恢复程序执行.
- 总结: 前者是程序无法处理的错误,后者是可以处理的异常.
常见Error以及Exception
RuntimeException:
- NullPointerException-空指针异常
- ClassCastException-类型强制转换异常,比如将类A的实例对象转换为无关的类B的对象.
- IllegalArgumentException-传递非法参数异常,比如传递了不满足要求的参数
- IndexOutOfBoundsException-下标越界异常
- NumberFormatException-数字格式异常,比如将字符串a转换为int类型的数字
非RuntimeException:
- ClassNotFoundException-找不到指定class异常.
- IOException-IO操作异常.
Error:
- NoClassDefFoundError-找不到class定义异常
可能是由于类依赖的class或者jar不存在.
或者是类文件存在,但是存在不同的域中.
也有可能是大小写问题,javac编译的时候是无视大小写的,很有可能编译出来的文件与想要的不一样. - StackOverFlowError-栈溢出,通常是由于深递归导致的.
- OutOfMemoryError–内存溢出
java的异常处理机制
- 首先抛出异常: 当一个方法出现错误或者异常时,系统会先创建异常对象,交由运行时系统处理.
- 然后捕获异常: 寻找一个合适的异常处理器处理异常,否则终止运行.
java异常的处理原则