一、异常概述:
程序在运行过程中,并不一定会按照程序开发人员预想的步骤来执行,因为实际情况千变万化,可能会出现各种各样不可预测的情况,例如用户输入了错误的数据、程序要打开的文件并不存在、程序需要访问网络中的某个资源时网络却不通畅等。这些情况出现时,如果没有处理好,就会导致程序出错或崩溃。因此,这些可预见的情况必须得到正确的处理,也就是要使用异常处理机制,以保证程序的稳定性和健壮性。
二、异常类的层次结构
在程序的执行过程中,可能会出现各种各样的异常情况,java语言用不同的异常类对象来表示它们,如下图是java语言中提供的异常类层次结构。
为了方便对Java程序中出现的异常情况的管理,Java SE API专门设计了java.lang.Throwable类,只有该类的子对象才可以在系统的异常传播体系中进行传递,该类有两个重要的子类,分别是:Error类和Exception类。
三、异常处理的情况
1.数学运算异常( java.lang.arithmeticexception)
程序中出现了除以零这样的运算就会出这样的异常,对这种异常,大家就要好好检查一下自己程序中涉及到数学运算的地方,公式是不是有不妥了。
2.数组下标越界(java.lang.arrayindexoutofboundsexception)
程序中大多都有对数组的操作,因此在调用数组的时候一定要认真检查,看自己调用的下标是不是超出了数组的范围,一般来说,显示(即直接用常数当下标)调用不太容易出这样的错,但隐式(即用变量表示下标)调用就经常出错了,还有一种情况,是程序中定义的数组的长度是通过某些特定方法决定的,不是事先声明的,这个时候,最好先查看一下数组的length,以免出现这个异常。
3.内存溢出异常(java.lang.OutOfMemoryError)
内存溢出分为Java堆溢出 、虚拟机栈和本地方法栈溢出 、方法区和运行常量池溢出、本机直接内存溢出
1.Java堆溢出 heap space:
Java堆溢出是因为Java堆容量不足导致的,可以通过设置虚拟机参数-Xms和-Xmx分别设定Java堆的最小容量和最大容量。
public class RuntimeConstantPoolOOM {
public static void main(String[] args) {
List list = new ArrayList ();
int i=0;
while(true){
list.add(String.valueOf(i++).intern());
//会产生java.lang.OutOfMemoryError:PermGen space
}
}
}
2.永久代容量不足 PermGen space:
永久代是记录常量,静态变量,类信息等,常见使用String.intern()方法导致常量过多;还有一种情况是使用CGlib动态创建类的代理过多,也会导致类信息膨胀;还有一种是Java Web中,Jsp文件过多导致,因为JSP其实也是一个Java类,可通过设置虚拟机参数-XX:PermSize和-XX:MaxPermSize分别设定永久代的最小容量和最大容量。
3,本级直接内存溢出DirectMemory:
通常是操作系统内存不足的情况下,Java应用程序还向操作系统申请本地内存导致,可通过设置-XX:MaxDirectMemorySize设定Java虚拟机可申请本地内存的最大容量。
4,创建线程过多(unable to create new native thread):由于每个线程都会分配一定的栈空间,申请线程过多,会导致栈空间不足,从而导致栈溢出,但Java虚拟机抛出异常信息的是 “java.lang.OutOfMemoryError:unable to create new native thread”这个异常在Windows系统上可能运行很久都不会抛出,而是会导致系统假死
4.程序遇上空指针(java.lang.nullpointerexception)
调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在创建图片,调用数组这些操作中,比如图片未经初始化,或者图片创建时的路径错误等等。对数组操作中出现空指针,很多情况下是一些刚开始学习编程的朋友常犯的错误,即把数组的初始化和数组元素的初始化混淆起来了。数组的初始化是对数组分配需要的空间,而初始化后的数组,其中的元素并没有实例化,依然是空的,所以还需要对每个要进行调用的元素都进行初始化
5.指定的类不存在(java.lang.classnotfoundexception)
这个异常是很多原本在jb等开发环境中开发的程序员,把jb下的程序包放在wtk下编译经常出现的问题,这里主要考虑一下类的名称和路径是否正确即可,如果是在jb下做的程序包,一般都是默认加上package的,所以转到wtk下后要注意把package的路径加上
6.方法参数错误(java.lang.illegalaccessexception)
很多j2me的类库中的方法在一些情况下都会引发这样的错误,比如音量调节方法中的音量参数如果写成负数就会出现这个异常,再比如g.setcolor(int red,int green,int blue)这个方法中的三个值,如果有超过255的也会出现这个异常,因此一旦发现这个异常,我们要做的,就是赶紧去检查一下方法调用中的参数传递是不是出现了错误。
7.没有访问权限(java.lang.illegalaccessexception)
当应用程序要调用一个类,但当前的方法即没有对该类的访问权限便会出现这个异常。对程序中用了package的情况下要注意这个异常。
8.错误(java.lang.Error)
错误,是所有错误的基类,用于标识严重的程序运行问题,这些问题通常描述一些不应该被应用程序捕获的反常情况。
原因:对系统所访问外部资源,未执行关闭操作,导致外部资源大量浪费,最终可能导致系统无法正常运行;对系统所访问的外部资源关闭次数太多,外部系统无法正常处理;系统访问的外部资源出现异常情况。
解决方法:访问外部资源之前,首先检查该资源(如数据库)是否可正常连接或操作;访问外部资源时,如果进行了连接,一定要关闭操作,并且仅进行一次关闭操作;尽量在同一操作*享外部资源,以减少该操作对资源的浪费,提高程序的执行效率。
例如初始化程序错误、违法访问错误、不兼容的类变化错误、实例化错误、内部错误、链接错误、未找到类定义错误、域不存在错误、方法不存在错误等等。