异常捕捉陷阱

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块来捕捉运行时异常。

    子类重写父类方法,不能声明抛出比父类方法类型更多,范围更大的异常;也就是说,子类重写父类方法,子类方法只能声明抛出父类方法所声明抛出异常的子类。
    如果同时实现多个接口的同一个方法,只能声明抛出实现接口方法声明异常的交集。
    
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值