异常处理总结
搜素网络资料中关于JAVA项目中的常用的异常处理情况,并将其总结成1500字左右的博客
课件异常处理总结(总结在后边)
1.异常的演示
异常 (Exception):发生于程序执行期间,表明出现了一个非法的运行状况。许多JDK中的方法在检测到非法情况时,都会抛出一个异常对象。 例如:数组越界和被0除。
2.Java中的异常捕获语句
Try{
//可能发生运行错误的代码;
}
catch(异常类型 异常对象引用){
//用于处理异常的代码
}
finally{
//用于“善后” 的代码
}
Java 中所有可捕获的异常都派生自 Exception 类。
3.JDK中与异常相关的类
4.Java中的异常分类:
Throwable类有两个直接子类:
Exception:出现的问题是可以被捕获的;
Error:系统错误,通常由JVM处理。
可捕获的异常又可以分为两类:
(1)Check异常:直接派生自Exception的异常类,必须被捕获或再次声明抛出
(2)Runtime异常:派生自RuntimeException的异常类。使用throw语句可以随时抛出这种异常对象: throw new ArithmeticException(…);
5.另一个著名的Error——OOM Error
在Android应用(它也使用Java开发)中,我们会经常碰到另一个Error,就是 “OutOfMemoryError”,表示系统内存不足,这个Error简写为“OOM Error”。
Android应用之所以经常发生OOM,其原因在于手机的内存有限,在处理大图片等耗费大量内存资源的工作时,会耗尽可用内存。
与一般Error不太一样,在Android应用中通常需要catch OOM并手动释放内存,以避免Android强制结束引发OOM的应用程序。
6.“finally”的功用
资源泄露:当一个资源不再被某应用程序使用,但此程序并未向系统声明不再使用此资源时发生这种情况
finally语句块主要用于解决资源泄露问题,它位于catch语句块之后,JVM保证它们一定执行。
注意:finally语句块中也可能发生异常,如果这种情况发生,先前的异常被放弃。
7.throws 语句
throws语句表明某方法中可能出现某种(或多种)异常,但它自己不能处理这些异常,而需要由调用者来处理。
当一个方法包含throws子句时,需要在调用此方法的代码中使用try/catch/finally进行捕获,或者是重新对其进行声明,否则编译时报错。
8.受控与不受控的异常
throws语句中声明的异常称为受控(checked)的异常,通常直接派生自Exception类。
RuntimeException(其基类为Exception) 和Error(基类为Throwable)称为非受控的异常。这种异常不用在throws语句中声明。
CheckedExceptionDemo.java示例展示了上述两种异常的特性。
关于JAVA项目中的常用的异常处理情况
一、异常发生的原因有很多,通常包含以下几大类:
1.用户输入了非法数据。
2.要打开的文件不存在。
3.网络通信是连接中断,或者JVM内存溢出。
二、几种常见的异常及其产生原因
1、java.lang.NullPointerException(空指针异常)
此错误非常常见,比如忘记给类初始化,就会出现这样的报错,该报错编译器显示为java.lang.nullpointerexception,此错误为调用了不存在或未开辟空间的对象,应注意对调用对象的及时分配空间。
2、 java.lang.ClassNotFoundException(指定的类不存在)
ClassNotFoundException异常后面跟的就是找不见的类路径。可以通过“CTRL+SHIFT+T”,之后再弹出的对话框中输入类路径,看看此类是否存在。
如果存在的话,直接在报错的类中通过“import 类路径”的形式引入即可。
如果不存在的话,那么只能是去创建此类,或者引入相应的jar包进行解决了。
3、 java.lang.NumberFormatException(字符串转换为数字异常)
当试图将一个String转换为指定的数字类型,而该字符串确不满足数字类型要求的格式时,抛出该异常.如现在讲字符型的数据"123456"转换为数值型数据时,是允许的。但是如果字符型数据中包含了非数字型的字符,如123#56,此时转换为数值型时就会出现异常。系统就会捕捉到这个异常,并进行处理。
4、java.lang.IndexOutOfBoundsException(数组下标越界异常)
仔细阅读源程序有关于涉及到数组的定义和使用,有没有出现数组的下标小于数组大小或者数组下标大于等于数组大小。
5、java.lang.IllegalArgumentException(方法的参数错误)
可能是接收到的参数非法,或者程序源代码没有错误的话就是配置的问题才会导致数据传输不过来,可能是配置文件的问题,也有可能是环境配置的问题,例如你的文件路径跟你从svn上的路径不对也会导致这个问题。
6、java.lang.IllegalAccessException(没有访问权限)
这个错误为你对调用对象的权限设置为private或protect,所以就会出现这个错误,编译器报错为java.lang.illegalaccessexception,这个错误,需编译者注意权限的设置,需调用的方法应设置为public。
7、java.lang.ArithmeticException(数学运算异常)
仔细阅读程序中是否有涉及到算术问题,算术中是不是未考虑到除0的情况。
8、java.lang.ClassCastException(数据类型转换异常)
当试图将对某个对象强制执行向下转型,但该对象又不可转换又不可转换为其子类的实例时将引发该异常,如下列代码。
Object obj = new Integer(0);
String str = obj;
9、 java.lang.FileNotFoundException(文件未找到异常)
1.可能是父路径缺乏,或者文件没有创建。可以加一个判断。
2.文件没创建
String localPath =path+name;
File file =new File(localPath);
try {
//假如文件不存在,需创建
if(!file.exists()){
file.createNewFile();
}
特别注意的是文件创建的是.TXT文本,要在文件名或者文件目录填写的时候,将文件名后缀加上,将.TXT加上。
10、java.lang.ArrayStoreException(数组存储异常)
当试图将类型不兼容类型的对象存入一个Object[]数组时将引发异常,如
Object[] obj = new String[3]
obj[0] = new Integer(0);
11、java.lang.NoSuchMethodException(方法不存在异常)
当程序试图通过反射来创建对象,访问(修改或读取)某个方法,但是该方法不存在就会引发异常。
12、 java.lang.EOFException(文件已结束异常)
当程序在输入的过程中遇到文件或流的结尾时,引发异常。因此该异常用于检查是否达到文件或流的结尾
13、java.lang.InstantiationException(实例化异常)
当试图通过Class的newInstance()方法创建某个类的实例,但程序无法通过该构造器来创建该对象时引发。Class对象表示一个抽象类,接口,数组类,基本类型 。该Class表示的类没有对应的构造器。
14、java.lang.InterruptedException(被中止异常)
当某个线程处于长时间的等待、休眠或其他暂停状态,而此时其他的线程通过Thread的interrupt方法终止该线程时抛出该异常。
15、java.lang.CloneNotSupportedException (不支持克隆异常)
当没有实现Cloneable接口或者不支持克隆方法时,调用其clone()方法则抛出该异常。
16、java.lang.OutOfMemoryException (内存不足错误)
当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误。
17、java.lang.NoClassDefFoundException (未找到类定义错误)
当Java虚拟机或者类装载器试图实例化某个类,而找不到该类的定义时抛出该错误。
三、总结
(1)在中间层组件中抛出异常,在界面层组件中捕获异常在底层组件中捕获JVM抛出的“只有程序员能看懂的”异常,转换为中间层的业务逻辑异常,再由界面层捕获以提供有意义的信息。
(2)自身能够处理的异常,不要再向外界抛出。
(3) 尽可能地在靠近异常发生的地方捕获并处理异常。
(4)尽可能地捕获最具体的异常类型,不要在中间层用 catch(Exception)“吃掉”所有异常
(5)在开发阶段捕获并显示所有异常信息,发布阶段要移除部分代码,以避免“过于专业”的异常信息困扰用户,特别地,系统发布之后,不要将服务端异常的详细信息发给客户端,以免被黑客利用。