一,引出问题
-
Java程序的执行过程中如出现异常,会生成一个异常类对象,该异常对象将被提交给Java运行时系统,这个过程称为
抛出(throw)异常
。 -
如果一个方法内抛出异常,该异常对象会被抛给调用者方法中处理。如果异常没有在调用者方法中处理,它继续被抛给这个调用方法的上层方法。这个过程将一直继续下去,直到异常被处理。这一过程称为
捕获(catch)异常
。 -
如果一个异常回到main()方法,并且main()也不处理,则程序运行终止。
二,throw和throws的区别
1.throw是语句抛出一个异常,throws是方法可能抛出异常的声明
2.throw出现在函数体,throws出现在方法函数头
3.throw是指抛出一个异常的动作,而throws代表一种状态,指的是可能有异常抛出。
4.throw只能用于抛出一种异常,而throws可以抛出多个异常。
自我理解:throw是在方法内,对可能出现的异常抛出一个异常对象,是new了一个对象,而throws是用在方法上,是声明一个异常,声明之后让这个方法的调用者进行处理,如果调用者不处理,接着throws向上抛出给上面的调用者,直到处理为止,那怎么处理呢,就是用try。。。catch。。。进行处理。
三,throw和throws面对受检异常和非受检异常的不同处理
受检异常需要throw和throws配合使用————throw抛出一个异常对象,然后throws声明向上给它的调用者
但是如果是非受检异常,也就是运行时异常,就不需要throw和throws配合使用,直接throw一个异常对象就可以————因为是非受检异常,所以不是必须throws,运行时才会出现异常。
附:康师傅的课件中的图解释一下发生异常时的执行流程
异常处理的体会
-
RuntimeException类
或是它的子类
,这些类的异常的特点是:即使没有使用try和catch捕获,Java自己也能捕获,并且编译通过 ( 但运行时会发生异常使得程序运行终止 )。所以,对于这类异常,可以不作处理,因为这类异常很普遍,若全处理可能会对程序的可读性和运行效率产生影响。 -
如果抛出的异常是IOException等类型的
非运行时异常
,则必须捕获,否则编译错误
。也就是说,我们必须处理编译时异常,将异常进行捕捉,转化为运行时异常。