Throwable是所有java程序中错误处理的父类,它可以分为两种子类:Error和Exception。
Error属于天灾,是无法预知的错误,属于JVM层次的严重错误,一般不需要捕捉和修复;
Exception属于人祸,是所有异常的父类,是程序的异常,一般可以修复,除了RuntimeException外都是检查性异常。
检查性异常(ckecked,有后遗症的):如果不处理的话编译不能通过(IOException,SQL异常或自定义异常。。。FileNotFoundException。。。),所以我们必须捕获此类异常,并为用户提供有用信息和合适的日志进行调试;
非检查性异常:又称不受检查异常,就是运行时异常,源于糟糕的编程。用户可以不处理,当出现这样的异常时,总是由虚拟机接管。如:没有确定好数组的长度,可能会抛空指针异常(NullPointException,ClassCastException,NumberFormatException,IndexOutOfBoundsException。。。)这些异常我们没有去处理过。
NullPointException:空指针异常,对象是null时会抛出,在调用传入对象时尽量判断是否为null,Jdk8里面可以用Optional对象来避免
IndexOutOfBoundsException:数组下标越界,数组的下标超过了最大值时会抛出,在迭代循环时检查下标是否越界
NumberFormatException:数字类型转化异常,将非数字类型转成数字类型,将类型转化的代码catch住
ClassCastException:类型转换异常,发生在强转时,将不同类型转成同一类型,尽量少用强转,或用instanceof(判断继承中子类的实例是否是父类的实现)做类型判断,或多用泛型
FileNotFoundException:找不到指定文件,文件路径错误或文件不存在,可能用了绝对路径检查文件是否存在,路径是否写错,多用相对路径
ClassNotFoundException:在classpath中找不到引用的类缺乏引用当前类的jar或没有设置classpath或jar损坏-,找到jar并放入classpath中或检查jar是否损坏
OutOfMemoryError:内存溢出异常,产生对象太多,内存不够->不要在循环体重创建大量对象,或对象及时回收,增大初始化堆:-Xms 增加最大值:-Xmx
NoClassDefFoundError:找不到相应的类错误,缺乏当前引用类的jar或jar版本不对->找到jar并放入classpath中或找到合适的版本
ConcurrentModificationException:并发修改异常,在集合迭代时修改里面的元素->在迭代时不要修改集合或用并发集合做遍历(如:ConcurrentHashMap)
NoSuchMethodError:类里找不到相应的方法,一般是jar版本不对,当前引用的jar版本中没有这个方法->检查jar版本是否正确
UnsupportedClassVersionError:版本不支持错误,编译class的jdk和运行时候的jdk版本不一致或比较高->将低版本换成高版本
StackOverflowError:栈溢出错误,一般是函数的死循环,或递归调用无法退出->检查死循环的代码,或让递归有退出值,或加大栈初始化参数
所处线程名字、异常类名、异常信息、异常堆栈、异常的源码,包名,类名,方法名,行数
一:通过try catch捕捉异常,顺序上先处理子类异常后父类,非特殊情况catch中不能为空,要处理错误,避免使用catch all(不能很准确的定位错误),尽量用catch,jdk7中可以处理并列异常,这个方法虽然简洁,但是也不够好(不同异常处理方法是一致的;多个异常间必须是平级关系)。清理数据必须放到finally里面,无论是否抛异常,或try中有return语句,finally里面的代码一定会执行,除非碰到System.exit(0)(艾克色特)
二:通过throws抛出异常,子类方法中抛出的异常应该是与父类方法中相同,或是父类异常的子类;一定要在main方法里面处理异常,不然jvm可能就退出了
getMessage:错误信息的字符串解释
getCause:返回异常产生的原因,一般是原始异常如果不知道原因返回null
printStackTrace:打印异常出现的位置或原因
toString:返回String格式的Throwable信息,此信息包括Throwable的名字和本地化信息
initCause:初始化原始异常
PrintStream和PrintWriter作为产生实现重载,这样就能实现打印栈轨迹到文件或流中
继承Exception是检查性异常,继承RuntimeException是非检查性异常,一般要复写两个构造方法,用throw抛出新异常
如果同时有很多异常抛出,那可能就是异常链,就是一个异常引发另一个异常,另一个异常引发更多异常,一般我们会找它的原始异常来解决问题,一般会在开头或结尾,异常可通过initCause串起来,可以通过自定义异常
异常会中断程序正常流程,异常比较耗性能,好的项目都有自定义异常