一、## 异常的分类##
1. 运行时异常(非受检异常)
常见的运行时异常
ArithmeticException 数学计算异常
NullPointerException 空指针异常
ArrayIndexOutOfBoundsException 数组索引越界异常
NumberFormatException 字符串转换成数值类型异常
NegativeArraySizeException 负数数长度异常
IndexOutOfBoundsException 指示某排序索引(例如对数组、字符串或向量的排序)超出范围异常
ClassNotFoundException 类文件未找到异常
ClassCastException 造型异常
2. 编译时异常(受检异常)
IOException 文件的操作
SocketException 网络连接
FIleNotFoundException 文件未找到异常
EOFException 读写文件尾异常
异常类的结构图
二、## 异常的概述##
异常就是软件中的bug,犹如人存在健康隐患。当程序出现问题了,不及时用try catch进行处理会终止整个系统,甚至会导致系统崩溃。
java运用异常机制的目的
改正运行时异常,预先处理编译异常
运行时异常的目的:
找到运行异常的位置,并且通过判断更改进而可以避免此运行时异常,
例如 String s = null 可以判断 if(s != null) s.length() 则可以避免运行时的空指针异常,可以通过对信息进行处理避免运行异常。
在有必要的时候可以try catch捕获运行异常,为了不影响下面的程序的执行。其中一般不会在catch中继续抛出运行时异常(如NullPointerExcepiton)
编译异常(受检异常)的目的:
为了预先处理(throws声明抛出或try catch捕获)不可避免的编译异常,并需要对该异常进行处理。并向用户提示适当的信息,并且还有让下面的程序继续执行
异常中的关键字
finally
在try,catch中代码块,无论try中代码是否抛出异常,或者是否在catch中继续抛出异常都会执行finally中的代码块
其中当catch中有return 那么finally也有return 那么最后方法得到的值是finally中返回的值 (其中把方法中所有的返回值放在返回值栈中,到最后返回的是从栈顶弹出一个返回值) 会覆盖掉正常返回值
注:当catch块中向上继续抛出异常时,在finally中有return值时,会隐藏抛出的异常
finally的缺点
finally中会隐藏正常代码中的返回值,隐藏catch中的返回值,同时会隐藏抛出的异常
finally的优点
可以用finally对出现异常中的打开的资源进行关闭
throw和throws
throws:
出现的位置:必须在方法声明的后面,后跟一个或多个异常类,但在方法中不一定要抛出
作用是:说明此方法不处理一个或多个异常类的对象
throw:
出现的位置 :方法中,try catch中,在方法体中任何地方 后面跟new 异常类的对象
作用 抛出异常类对象
1.有throw一定有throws,但有throws并不一定有throw
2.throws后面的异常对象必须和throw new 异常类对象要对应
二、## 异常数据结构和异常栈跟踪##
Exception类中有个私有属性message,子类只能通过Exception中的构造方法才可对message进行设值。通过getMessage得到异常信息,其中追踪方法中出现的异常采用的是堆栈数据结构
public class TestException{
public void m1()throws MyException{
m2();
}
public void m2()throws MyException{
m3();
}
public void m3()throws MyException{
throw new MyException();
}
public static void main(String[] args){
TestException t = new TestException()'
try{
t.m1();
}catch(MyException e){
e.printStackTrace();
}
}
}
首先把从主方法开始,把方法m1,方法m2,方法m3压入栈中,jvm从栈顶方法m3执行,当出现异常时(jvm创建异常对象),若该方法中没有通过try catch异常处理机制则检测方法是否声明了抛出该异常throws MyException(若既没有捕获也没有声明则系统终止程序)则交给调用方法m3的方法进行处理,保存异常信息以及出错的位置(那个方法,以及出错的位置),然后弹出方法m3,又会执行方法m2,重复上面的步骤。直到把异常交给了主方法main进行处理,检查该方法中有异常处理,则把异常对象抛给catch(MyException e)通过e.printStackTrace()输出方法栈中的所有异常信息
注: 所以当没有必要抛出异常时,尽量不要随意抛出,jvm新建异常对象,保存异常信息并追踪异常信息会耗时,耗资源。
当JVM创建异常对象 给异常对象中messge设置的什么信息,以及异常对象的toString方法 异常父类Exception的 String toString() return this.getClass()+”:”+this.getMessage() 返回的是异常信息
Jvm给一下异常对象设置的message信息为
Integer.parseInt(“1.2”)
NumberFormatException
For input string:”1.2(转换数据出错的字符串) “
ClassNotFoundException
java.lang.ClassCastException: bank.dynamo.view.test.Test cannot be cast to bank.dynamo.view.test.A
NullPointerException
Java.lang.NullPointerException
ArtihmeticException
java.lang.ArithmeticException: / by zero
ArrayIndexOutOfBoundsException
int[] a = new int[2]; int i = a[3];
3代表导致出现数组越界的序号
java.lang.ArrayIndexOutOfBoundsExeption:3
NegativeArraySizeException 负数长度异常
java.lang.NegativeArraySizeExcepton
FileNotFoundException
java.io.FileNotFoundException: c:\t.txt (系统找不到指定的文件。)
Class.forName(“java.dynamo.Test”)加载时找不到指定包下的字节码文件
ClassNotFoundException:java.dynamo.Test