1.异常的定义
异常是指程序在运行时期发生不正常事件,导致程序指令流程的无法正常执行。
2.异常的分类
错误(error):jvm系统的内部错误或资源耗尽等严重情况,属于jvm需要负担的责任。
异常(exception):编程的错误或其他外在的因素导致的一般性问题。
注意:程序员只需要处理异常(Exception),而无法处理错误。
Error(错误):由Java虚拟机生成并抛出,程序对其不做处理
Exception(异常):所有异常的父类,一般需要用户显示的声明或捕获。
RuntimException:一类的特殊异常,如被0除,,空指针数组越界等,其产生比较频繁,处理麻烦,
如果显示的声明或捕获将会对程序可读性和运行效率影响很大,因此由系统自动检测并交将它们交给缺省的异常处理程序。
2.1异常分类(从编程的角度)
非受检(unchecked)异常:编译器不要求强制处置的异常。
一般是指编程时的逻辑错误,程序员应当要避免的事情
java.lang.RuntimeException 及它的子类都是非受检异常
错误的类型转换:java.lang.ClassCastException
数组下标越界:java.lang.ArrayIndexOutOfBoundsException
空指针访问:java.lang.NullPointerException
算术异常(除0溢出):java.lang.ArithmeticException
受检(checked)异常:编译器要求必须处置的异常。指程序运行时由于外界因素造成的一般性异常
没有找到指定名称的类:java.lang.ClassNotFoundException
访问不存在的文件:java.io.FileNotFoundException
操作文件时发生的异常:java.io.IOException
操作数据库时发生的异常:java.sql.SQLException
3.异常处理的机制
Java程序在执行的过程中如果出现了异常,会自动生成一个异常类对象,并自动提交给JVM,这过程称为抛出(throw)异常
JVM接收到该异常对象后,会寻找能处理该异常的代码并将该异常对象交给它处理,这过程叫做捕获异常和处理异常
如果JVM找不到捕获该异常的代码,则运行时系统将终止,相应的Java程序也将退出。
4.try--catch--finally
try{}:可能发生异常的代码块区域,会产生一种或几种类型的异常对象,后面的catch语句会对其进行处理
catch():可以有多个catch语句捕获多种类型的异常,但是异常子类必须位于异常父类之前。
finally():异常处理的统一出口,一定会执行的代码块,但是它是可选的,通常处理资源文件,如关闭打开的文件,删除临时文件,关闭数据库的连接。
5.throws关键字(方法上)
在定义一个方法的时候使用,表示该方法产生的异常不进行处理,交给该方法调用处进行处理
public void method throws e1,e2{};
6.throw关键字(方法内)
在方法内中抛出一个异常(throw new Exception();),如果该异常是受检异常则必须进行如下处理,如果是非受检异常则没事
处理这个抛出来的(受检)异常,可以选择try-catch它,或者用throws将它抛出方法之外。
7.自定义异常使用
public class ExceptionTest { public static void main (String args[]) throws MyException { int y; int x=y=0; int z=x/y; if (y==0) throw new MyException("分母为0"); } } class MyException extends Exception { public MyException () { super(); } public MyException(String msg) { super(msg); } }
小结:
异常抛出的原则:
1,仅有一个与异常对应catch模块执行,剩下的catch模块不会执行。且
Java只对第一个发现的异常进行catch,不再继续执行下去,即后面
可能出现异常的代码不再执行,并catch它。
2,具有父类的catch模块要放到最后面,否则无法编译过去。
异常在子父类覆盖中的体现;
1,子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类。
2,如果父类方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集。
3,如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。
如果子类方法发生了异常。就必须要进行try处理。绝对不能抛。
finally{}代码块:
只要catch或前面的语句使用了return语句,则finally区域还是会执行,除非在这之间执行了System.exit(0),则finally区域不会执行
throw和throws区别:
throw用在方法内部:throw new Exception (); throws用在方法定义上:public void method throws Exception
注意:如果throw出的异常是非受检异常(RuntimeException子类),则无需对这异常进行捕获/抛出,除非是受检异常。