异常要抓还是要抛

        如果方法设计流程中发生异常,而你设计时并没有充足的信息知道该如何处理(例如不知道链接库会用在什么环境),那么可以抛出异常,让调用方法的客户端来处理。

        操作对象的过程中如果会抛出受检异常,但目前环境信息不足以处理异常,无法使用try...catch处理时,可由方法的客户端依据当时调用的环境信息进行处理。为了告诉编译程序这个事实,必须使用throws声明此方法会抛出的异常类型或父类型,编译程序才会让你通过编译。

        抛出受检异常,表示你认为调用方法的客户端有能力且应该处理异常,throws声明部分会是API操作接口的一部分,客户端不用查看原始码,从API文件上就能直接得知,该方法可能抛出哪些异常。

        如果你认为客户端调用方法的时机不当引发了某个错误,希望客户端准备好前置条件,再来调用方法,这时可以抛出非受检异常让客户端得知此情况,如果是非受检异常,编译程序不会明确要求使用try...catch或在方法上使用throws声明,因为Java会认为非受检异常是程序设计不当引发的BUG,异常应自动向外传播,不应使用try...catch来尝试处理,而应改善程序逻辑来避免引发错误。

        实际上在异常发生时,可使用try...catch处理当时环境可进行的异常处理,当时环境下无法决定如何处理的部分,可以抛出由调用方法的客户端处理。

        在catch代码块进行完部分错误处理之后,可以使用throw(注意不是throws)将异常再抛出,实际上,可以在任何流程中抛出异常,不一定要在catch代码块中,在流程中抛出异常,就直接调离原有的流程,可以抛出受检或非受检异常,如果抛出的是受检异常,表示你认为客户端有能力且应处理异常,此时必须在方法上使用throws声明,如果抛出的异常是非受检异常,表示你认为客户端调用方法的时机出错了,抛出异常是要求客户端修正这个BUG再来调用方法,此时也就不使用throws声明。

        如果使用继承时,父类某个方法声明throws某些异常,子类重新定义该方法时可以:

        a.不声明throws任何异常;

        b.throws父类该方法中声明的某些异常;

        c.throws父类该方法中声明异常的子类;

        但是不可以:

        a.throws父类方法中未声明的其他异常;

        b.throws父类方法中声明异常的父类。

转载于:https://my.oschina.net/u/3268478/blog/841783

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值