打字猴:1.700448835e+09
1700448835
1700448836 我们知道,异常需要封装和传递,只有封装才能让异常更容易理解,上层模块才能更好的处理,可这也会导致低层级的异常没玩没了的封装,无端加重了开发的工作量。比如FileNotFoundException在持久层抛出,就需要定义一个MyException进行封装,并抛出到上一个层级,于是增加了开发工作量。
1700448837
1700448838 受检异常有这么多的缺点,那有没有什么办法可以避免或减少这些缺点呢?有,很简单的一个规则:将受检异常转化为非受检异常即可,但是我们也不能把所有的受检异常转化为非受检异常,原因是在编码期上层模块不知道下层模块会抛出何种非受检异常,只有通过规则或文档来约束,可以这样说:
1700448839
1700448840 受检异常提出的是“法律下的自由”,必须遵守异常的约定才能自由编写代码。
1700448841
1700448842 非受检异常则是“协约性质的自由”,你必须告诉我你要抛出什么异常,否则不会处理。
1700448843
1700448844 以User接口为例,我们在声明接口时不再声明异常,而是在具体实现时根据不同的情况产生不同的非受检异常,这样持久层和逻辑层抛出的异常将会由展现层自行决定如何展示,不再受异常的规则约束了,大大简化开发工作,提高了代码的可读性。
1700448845
1700448846 那问题又来了:在开发和设计时什么样的受检异常有必要转化为非受检异常呢?“尽可能”是以什么作为判断依据呢?受检异常转换为非受检异常是需要根据项目的场景来决定的,例如同样是刷卡,员工拿着自己的工卡到考勤机上打考勤,此时如果附近有磁性物质干扰,则考勤机可以把这种受检异常转化为非受检异常,黄灯闪烁后不做任何记录登记,因为考勤失败这种情景不是“致命”的业务逻辑,出错了,重新刷一下即可。但是到银行网点取钱就不一样了,拿着银行卡到银行取钱,同样有磁性物质干扰,刷不出来,那这种异常就必须登记处理,否则会成为威胁银行卡安全的事件。汇总成一句话:当受检异常威胁到了系统的安全性、稳定性、可靠性、正确性时,则必须处理,不能转化为非受检异常,其他情况则可以转换为非受检异常。
1700448847
1700448848 注意 受检异常威胁到系统的安全性、稳定性、可靠性、正确性时,不能转换为非受检异常。
1700448849
1700448850
1700448851
1700448852
1700448853 编写高质量代码:改善Java程序的151个建议 [:1700438187]
1700448854 编写高质量代码:改善Java程序的151个建议 建议113:不要在finally块中处理返回值
1700448855
1700448856 在finally代码块中处理返回值,这是考试和面试中经常出现的题目。虽然可以以此来出考试题,但在项目中绝对不能在finally代码块中出现return语句,这是因为这种处理方式非常容易产生“误解”,会严重误导开发者。例如如下代码:
1700448857
1700448858 public static void main(String[]args){
1700448859
1700448860 try{
1700448861
1700448862 doStuff(-1);
1700448863
1700448864 doStuff(100);
1700448865
1700448866 }catch(Exception e){
1700448867
1700448868 System.out.println(“这里是永远都不会到达的”);
1700448869
1700448870 }
1700448871
1700448872 }
1700448873
1700448874 //该方法抛出受检异常
1700448875
1700448876 public static int doStuff(int_p)throws Exception{
1700448877
1700448878 try{
1700448879
1700448880 if(_p<0){
1700448881
1700448882 throw new DataFormatException(“数据格式错误”);
1700448883
1700448884 }else{
[ 上一页 ]  [ :1.700448835e+09 ]  [ 下一页 ]