finally执行规则:
eg1: try{
Systrm.exit(0) ;}finally{System.out.peintln("finally 块!");}
不论try块正常结束或者非正常结束,finally的确会执行;但是上述例子不会输出finally块内容,因为System.exit(0)根本没有结束执行过程,System.exit(0)将停止当前线程和其他当场死亡的线程,finally不能使已经停止的线程就行执行,所以System.exit(0)后finally块不会被执行。
System.exit(0)调用时,虚拟机执行两项清理工作:
(1)执行系统中注册的所有关闭钩子;
(2)如果系统调用了System.runFinalizerOnExit(true);JVM会对没有结束的对象调用Finalizer。
第二种是极度危险的。
第一种是安全的操作,程序可以将关闭资源的操作注册成为关闭钩子,JVM推出前会被调用。
Runtime.getRuntime().addShutdownHook(
new Thread(){
public void run(){
xxx.close() ;
}
}) ;
当try块执行到return或者throw时,不会立刻停止当前方法,而是转去寻找finally块,如果没有finally块,返回相应值;如果有finally块,系统立刻开始finally块,,当finally块执行完后跳回return语句导致方法结束。如果finally已经结束方法,系统将不会跳回去执行try、catch块里面全部代码
catch块用法:
try...catch语句的多个catcj块应该先捕获子类异常(子类代表范围小),后捕获父类异常(父类代表范围大),否则编译器会提示编译错误。千万不可以使用异常来进行流程控制(难以阅读,速度很慢)。
异常分为Runtime异常和Checked异常:当catch试图捕获Checked异常时,那么对应的try块必须可能抛出Checked异常或者其子类,否则编译错误(代码可能抛出Checked异常,那么其中调用的方法或者构造器声明了该Checked异常,而且程序必须处理该异常,或者抛出);对应Runtime异常,只要愿意,程序可以在任何时候使用cacth块来捕捉运行时异常。
子类重写父类方法,不能声明抛出比父类方法类型更多,范围更大的异常;也就是说,子类重写父类方法,子类方法只能声明抛出父类方法所声明抛出异常的子类。
如果同时实现多个接口的同一个方法,只能声明抛出实现接口方法声明异常的交集。
737

被折叠的 条评论
为什么被折叠?



