(四)Java异常
Java异常
1、运行时异常
运行时异常都是 RuntimeException 子类异常
-
NullPointerException - 空指针异常
-
ClassCastException - 类转换异常
-
IndexOutOfBoundsException - 下标越界异常
-
ArithmeticException - 计算异常
-
IllegalArgumentException - 非法参数异常
-
NumberFormatException - 数字格式异常
-
UnsupportedOperationException 操作不支持异常
-
ArrayStoreException - 数据存储异常,操作数组时类型不一致
-
BufferOverflowException - IO 操作时出现的缓冲区上溢异常
-
NoSuchElementException - 元素不存在异常
-
InputMismatchException - 输入类型不匹配异常
2、OutOfMemoryError原因
OutOfMemoryError 分为多种不同的错误:
-
Java heap space
原因:JVM 中 heap 的最大值不满足需要 解决: 调高 heap 的最大值,-Xmx 的值调大 如果程序存在内存泄漏,增加 heap 空间也只是推迟该错误出现的时间而已,要检查程序是否存在内存泄漏
-
GC overhead limit exceeded
原因:JVM 在 GC 时,对象过多,导致内存溢出 解决:调整 GC 的策略,在一定比例下开始GC而不使用默认的策略,或将新代和老代设置合适的大小,可以微调存活率。如在老代 80% 时就是开始GC,并且将 -XX:SurvivorRatio(-XX:SurvivorRatio=8)和-XX:NewRatio(-XX:NewRatio=4)设置的更合理
-
Java perm space
原因:JVM 中 perm 的最大值不满足需要,perm 一般是在 JVM 启动时加载类进来 解决:调高 heap 的最大值,即 -XX:MaxPermSize 的值调大解决。如果 JVM 运行较长一段时间而不是刚启动后溢出的话,很有可能是由于运行时有类被动态加载,此时可以用 CMS 策略中的类卸载配置解决如:-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled
-
unable to create new native thread
原因:当 JVM 向系统请求创建一个新线程时,系统内存不足无法创建新的 native 线程 解决:JVM 内存调的过大或者可利用率小于 20%,可以将 heap 及 perm 的最大值下调,并将线程栈内存 -Xss 调小,如:-Xss128k
-
Requested array size exceeds VM limit
原因:应用程序试图分配一个大于堆大小的数组 解决: 检查 heap 的 -Xmx 是不是设置的过小 heap 的 -Xmx 已经足够大,检查应用程序是不是存在 bug 计算数组的大小时存在错误,导致数组的 length 很大,从而导致申请巨大的数组
-
request XXX bytes for XXX. Out of swap space
原因:从 native 堆中分配内存失败,并且堆内存可能接近耗尽,操作系统配置了较小的交换区,其他进程消耗所有的内存 解决:检查操作系统的 swap 是不是没有设置或者设置的过小;检查是否有其他进程在消耗大量的内存,导致 JVM 内存不够分配
3、运行时异常与受检查异常的异同
1)运行时异常,表示程序代码在运行时发生异常,程序代码设计的合理,这类异常不会发生
2)受检查异常跟程序运行的上下文环境有关,即使程序设计无误,仍然可能因使用的问题而引发
3)Java编译器要求方法必须声明抛出可能发生未被捕获的受检查异常,不要求必须声明抛出运行异常
4、异常的设计原则
-
不要将异常处理用于正常的控制流
-
对可以恢复的情况使用受检异常,对编程错误使用运行时异常
-
避免不必要的使用受检异常
-
优先使用标准的异常
-
每个方法抛出的异常都要有文档
-
保持异常的原子性
-
不要在 catch 中忽略掉捕获到的异常
5、Java异常的结构
Throwable
--Error:是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题
--Exception:
--RuntimeException:运行时异常,编译通过了,但运行时出现的异常