事物在发展或者变化过程中常常会出现各种各样的不正常现象,程序的世界中,也不存在永远不会出错的程序,只有正确处理好异常情况,才能保证程序的可靠性,Java语言在设计之初,就提供了相对完善的处理机制,下面一起来看看把:
Java异常的继承体系
(1)Throwable 类是整个Java异常体系的超类,包含Error和Exception两个直接子类
(2)Error 一般指AVA虚拟机出现错误,在程序中不便也不需要捕获Error类型的异常,例如OutOfMemoryError
(3)Exception是应用层面上最顶层的异常类,包含RuntimeException(运行时异常,非检查异常)和 Checked Exception(检查异常)
- 检查异常是指编译器在编译期间要求必须得到处理的那些异常
Error和Exception区别
(1)Error:程序无法处理的系统错误,编译器不做检查,如系统崩溃、虚拟机错误、系统内存不足等
(2)Exception:程序可以处理的异常,捕获并处理后可以恢复
总结:前者是程序无法处理的错误,后者是可以处理的异常
运行时异常和非运行时异常的区别
运行时异常:不可预知,程序应当自动避免
非运行时异常:可预知的,从编译器校验的异常
Java常见异常汇总
UncheckedException
- AlreadyBoundException:试图将注册表中的对象绑定到已具有相关绑定的名称上时抛出的异常
- ClassCastException:类造型异常。假设有类A和B(A不是B的父类或子类),O是A的实例,那么当强制将O构造为类B的实例时抛出该异常。该异常经常被称为强制类型转换异常。
- ConcurrentModificationException:使用iterator遍历集合的同时对集合进行修改时抛出的异常
- IllegalArgumentException:非法参数异常
- IllegalStateException:违法的状态异常。当在Java环境和应用尚未处于某个方法的合法调用状态,而调用了该方法时,抛出该异常。
- IndexOutOfBoundsException:索引越界异常。当访问某个序列的索引值小于0或大于等于序列大小时,抛出该异常。
- JSONException:JSON解析异常
- NullPointerException:空指针异常
- SecurityException:安全异常
- UnsupportedOperationException:不支持的方法异常。指明请求的方法不被支持情况的异常。
CheckedException
- ClassNotFoundException:找不到类异常。当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。
- CloneNotSupportedException:不支持克隆异常,当没有实现Cloneable接口或者不支持克隆方法时,调用其clone()方法则抛出该异常。
- FileAlreadyExistsException:当软链已经存在时会抛出的异常
- FileNotFoundException:文件未找到异常
- InterruptedException:被中止异常,当某个线程处于长时间的等待、休眠或其他暂停状态,而此时其他的线程通过Thread的interrupt方法终止该线程时抛出该异常。
- IOException:输入输出异常
- SQLException:操作数据库异常
- TimeoutException:响应超时
- UnknownHostException:未知的名称或服务,表示项目启动找不到映射名称或服务
Error
- AssertionError:断言出错,用来指示一个断言失败的情况
- OutOfMemoryError:内存不足错误,当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误。
- StackOverflowError:堆栈溢出错误。当一个应用递归调用的层次太深而导致堆栈溢出时抛出该错误。
Java异常处理的注意事项
(1)当前线程会停止运行,异常触发点后面的代码将得不到运行
(2)异常catch有顺序性,优先catch子类型异常
(3)尽量不要捕获类似Exception这样的通用异常,而是应该捕获特定异常
(4)涉及到资源时,需要finally代码块中释放资源,无论是否发生异常,finally 代码块中的代码总会被执行
(5)try-cath代码段会产生额外的性能开销,建议仅捕获有必要的代码段,try的范围应该尽量小
(6)不要使用异常控制代码流程
(7)在方法注释(Javadoc)的地方把指定的异常记录下来
(8)尽量不要捕获异常却又什么都不做