一 异常的分类
这是从jdk AP里简单摘出来,java中关于Exception和ERROR的一个关系,
可以看出他们都来自于同一个父类Throwable。
Error:java中的Error是比较严重的问题,非程序本身的问题,一般都是虚拟机相关的异常,如OOM,StackOverflow,如果大家接触过JVM调优不会陌生。
Exception:细分RuntimeException和其他,为什么有这么细分呢,其实跟后面的异常处理是有关系的,RuntimeException和其子类都是不可查异常(unchecked Exception),编译时不会对其进行检查,只有在运行时才会进行检查和处理。而另外一类异常,即可查异常(checked Exception),这些异常需要在编译阶段必须进行处理的,所有的非RuntimeException都属于可查异常(checkedException),如IOException。
二 异常的处理
2.1 try,catch,final
这个应该是最常见的,处理异常的方式,try代码块中是被监控的可能会产生异常的,catch中是对异常的处理,可以包括多个catch,注意catch中的异常,一定是先catch子类,再catch父类,finally是不管是否发生异常都会执行的。这样说不是特别准确,特别面试的时候面试官经常会问,finally的代码一定会执行嘛,什么情况下不会执行。
finally代码块不执行的几种情况:
1)在finally语句块中发生了异常。
2)在前面的代码中用了System.exit()退出程序。
3)程序所在的线程死亡。
4)关闭CPU
2.2throw和throws
throws是在方法声明时抛出一些自己处理不了的异常,或者调用者发现被调用的方法声明有Throws异常,可以继续上抛,如果所有上层的方法都不能处理,则最终会被JVM处理,处理的方法也很简单,就是打印出异常信息。
throw是在方法中,一般是在catch到异常时,抛出一些自定义的异常,后面用于问题定位。
2.3异常处理的原则
1)异常处理主要就是两点,一是抛出异常(throw,throws),二是捕获异常(try,catch,finally)。
2)分可检查异常(checked Exception)和非可查异常(unckecked Exception)。
3)如果是可查异常,不处理,是编译不通过的,两种处理方式,一种是try,catch,finally。第二种就是在方法生命是显示的抛出。
4)如果是非可查异常,不显示的throws是可以编译通过,这就需要我们平时编码的时候,注意代码可能会产生的非可查异常,可以进行trycatch,打印异常信息,或者包装成自定义的异常。
5)对应一些处理不了的异常,一定要继续上抛,而不是自己吞掉,不然后面定位问题很痛苦。
三 常见异常
说明 | 异常名称 |
---|---|
算数异常类 | ArithmeticExecption |
空指针异常类型 | NullPointerException |
类型强制转换类型 | ClassCastException |
数组负下标异常 | NegativeArrayException |
数组下标越界异常 | ArrayIndexOutOfBoundsException |
文件已结束异常 | EOFException |
文件未找到异常 | FileNotFoundException |
字符串转换为数字异常 | NumberFormatException |
操作数据库异常 | SQLException |
输入输出异常 | IOException |
方法未找到异常 | NoSuchMethodException |
下标越界异常 | IndexOutOfBoundsExecption |
系统异常 | SystemException |
创建一个大小为负数的数组错误异常 | NegativeArraySizeException |
数据格式异常 | NumberFormatException |
非法参数异常 | IllegalArgumentException |