在之前的学习中讲到,Java的异常处理中会用到一个Java提供的处理办法:try-catch+finally。之前已经讲过try-catch 的用法了,接下来要说的就是finally的用法。
finally语句块格式:finally{必须执行的语句}。
可能会产生疑问的地方就是try-catch语句后的其他语句也可以正常的运行,那么要finally有何用?
其实try-catch语句后的其他语句之所以能够继续正常运行,是因为try-catch在捕获异常并处理后并没有终止程序,试想一下,如果catch语句执行完成后,加上一个return语句跳出,那么后面的语句就无法执行了。
举个实例:假设有个数据库,如果有一个用户连接上了,可是却抛出了异常,在处理完异常后,直接返回一个错误提示就终止程序,而没有断开连接,那么就会一直占用资源,导致其他用户无法接入,但是,如果有了finally语句,不管try-catch 语句结束后发生什么,finally中的语句都会执行。
从上面的实例已经可以看出finally的主要功能就是用于关闭资源。
================================================================================================================================
在Java的异常处理中,还有一个小知识点,就是重写 抛出异常的方法。
注意:
1,子类重写父类方法时,如果父类方法抛出异常,那么子类重写该方法时只能抛出父类异常或该异常的子类或不抛出异常。
2,如果父类方法抛出多个异常,那么子类方法只能抛出父类抛出异常的子集(就是各种父类异常和这些异常的子异常和不抛出异常的随机组合)
3,如果父类无异常抛出,那么子类也不能抛出。
4,如果子类存在异常,且该异常不满足上述条件,那么只能用try-catch 处理,不能抛出。
从上面的注意事项中不难看出,子类抛出的异常的等级不能大于父类,这是为什么呢?其实很好理解,假如你要更新,建立了新的子类继承父类,直接重写父类方法达到更新目的时,如果满足上述条件,那么根据多态的性质,原先用于捕获处理异常的catch语句中的参数类型就无需更改,那么整个程序改动的地方就相当的少,如果不满足上述条件,也就是说无法利用多态时(当然也可以选择第4条进行处理),自然没有重写的意义了。