优雅编程之这样处理异常,你就“正常”了!
来源:互联网 发布:王兀 知乎 编辑:程序博客网 时间:2024/04/28 08:20
开心一笑
【一交警在开罚单,一男子叼着烟过来喊:你除了开罚单还会干什么?
交警没理睬,男子继续:有种拖走啊!
交警很愤怒,男子继续:有种拖走啊!
交警忍无可忍拿出对讲机,拖车时交 警和蔼说:下午到五大队来处理!
男子:关我鸟事!车又不是我的!
说完哼着小曲骑着电瓶车走了】
提出问题
如何处理异常才能使代码更简洁???
解决问题
1)使用异常而非返回码,这里的异常处理就是我们经常写的try catch;
package com.hwy.test;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class CodeCleanTest { private Logger log = LoggerFactory.getLogger(this.getClass()); public boolean eat(){ boolean isCompleted = false; try{ System.out.println("美味"); isCompleted = true; }catch (Exception e){ log.info(e.getMessage()); } return isCompleted; }}
2)不要返回null值:这样的话调用者就要处理null,增加工作量;解决:抛出异常或者返回特例对象(利用Collections.emptyList());
错误示例:
package com.hwy.test;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.util.ArrayList;import java.util.List;public class CodeCleanTest { private Logger log = LoggerFactory.getLogger(this.getClass()); /** * 约会 */ public void datWithGirl(){ List<String> snacksList = buySnacks(); if(null != snacksList){ List<String> litter = eatSnacks(snacksList); dropLitter(litter); } } /** * 买零食(事实这些注释都是不需要,只是为了大家理解) * @return */ public List<String> buySnacks(){ List<String> snacksList = new ArrayList<>(); snacksList.add("牛奶"); snacksList.add("巧克力"); snacksList.add("土豆片"); return snacksList; } /** * 吃零食(事实这些注释都是不需要,只是为了大家理解) * @param snacks */ public List<String> eatSnacks(List<String> snacks){ if(null != snacks) { for (String snack : snacks) { System.out.println("一起吃" + snack); } } return snacks; } /** * 仍垃圾(事实这些注释都是不需要,只是为了大家理解) * @param litter */ public void dropLitter(List<String> litter){ if(null != litter){ for(String snack:litter){ System.out.println("一起吃" + snack); } } }}
正确示例:可看里面详细的注释,要有耐心哦!
package com.hwy.test;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.util.ArrayList;import java.util.List;public class CodeCleanTest { private Logger log = LoggerFactory.getLogger(this.getClass()); /** * 约会 */ public void datWithGirl() throws Exception { List<String> snacksList = buySnacks(); /** 利用逆向思维,抛出一个业务异常,这里我只是用简单的exception代替 **/ if(null == snacksList || snacksList.size() ==0){ throw new Exception("你没买到零食或买到的零食有问题,请检查!"); } /** 代码执行到这一步就说明snacksList不为null,之后的所有 * 操作都不用判断snacksList是否为空 **/ List<String> litter = eatSnacks(snacksList); dropLitter(litter); } /** * 买零食(事实这些注释都是不需要,只是为了大家理解) * @return */ public List<String> buySnacks(){ List<String> snacksList = new ArrayList<>(); snacksList.add("牛奶"); snacksList.add("巧克力"); snacksList.add("土豆片"); /** 在这里如果snacksList为空的话,可以用Collections.emptyList(),就不用 ** 在上面处理异常了 **/ //return Collections.emptyList(); return snacksList; } /** * 吃零食(事实这些注释都是不需要,只是为了大家理解) * @param snacks */ public List<String> eatSnacks(List<String> snacks){ for (String snack : snacks) { System.out.println("一起吃" + snack); } return snacks; } /** * 仍垃圾(事实这些注释都是不需要,只是为了大家理解) * @param litter */ public void dropLitter(List<String> litter){ for(String snack:litter){ System.out.println("一起吃" + snack); } }}
3)在方法中返回null值是很糟糕的,但讲null传递给其他方法就更糟糕了,具体解决方法如下:
package com.hwy.test;import org.junit.Assert;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.util.List;public class CodeCleanTest { private Logger log = LoggerFactory.getLogger(this.getClass()); public static void main(String[] args) throws Exception { datWithGirl(); } /** * 约会 */ public static void datWithGirl(){ /** 这里返回为null **/ List<String> snacksList = buySnacks(); /** 在吃零食方法中,需要处理异常 **/ List<String> litter = eatSnacks(snacksList); dropLitter(litter); } /** * 买零食(事实这些注释都是不需要,只是为了大家理解) * @return */ public static List<String> buySnacks(){ return null; } /** * 吃零食(事实这些注释都是不需要,只是为了大家理解) * @param snacks */ public static List<String> eatSnacks(List<String> snacks){ /** 第一种处理方法 **/// if(null == snacks){// throw new NullPointerException("没有零食吃!!!");// } /** 第二种处理方法, **/ Assert.assertNotNull("没有零食吃!!!",snacks); for (String snack : snacks) { System.out.println("一起吃" + snack); } return snacks; } /** * 仍垃圾(事实这些注释都是不需要,只是为了大家理解) * @param litter */ public static void dropLitter(List<String> litter){ for(String snack:litter){ System.out.println("一起吃" + snack); } }}
运行结果:
java.lang.AssertionError: 没有零食吃!!!at org.junit.Assert.fail(Assert.java:93)at org.junit.Assert.assertTrue(Assert.java:43)at org.junit.Assert.assertNotNull(Assert.java:526)at com.hwy.test.CodeCleanTest.eatSnacks(CodeCleanTest.java:48)at com.hwy.test.CodeCleanTest.datWithGirl(CodeCleanTest.java:23)at com.hwy.test.CodeCleanTest.main(CodeCleanTest.java:13)
4)不管做哪种类型的应用,都应该尽可能向用户隐藏异常的发生,除非发生了不可挽救的状况,这才是符合最小惊讶原则的设计
5)异常的信息应该足够充分(包含出错的位置以及原因)
6)避免使用可控异常(checked exception):因为处理它们需要修改函数头(在每个调用该函数的函数添加throw Exception),违反了开放-闭合原则;应该使用不可控异常(runtime exception);
读书感悟
来自《峰与谷》
- 在我们的工作和生活中,每个人都会遭遇高峰和低谷,这是人生的常态。
- 看着你所失去的,你就会跌入不幸的谷底;看着你所拥有的,你就会处在幸福的高峰。
- 征服内心的恐惧,就意味着你处在人生的高峰状态。
- 上天之所以制造苦难,是为了唤醒你的觉知——要关注那些被你忽视的真相。
- 通过制订愿景来攀登高峰是一个好办法。它能够让你产生一种渴望,并且愿意用自己的行动把愿景变成现实。
- 从高峰上迅速跌落低谷的原因,往往是不了解真相的骄傲自满;在低谷里无法重新振作的原因,往往是不了解真相的忧虑恐惧。
- 高峰和低谷不仅是外部的顺境和逆境,更是你内心深处的感觉和变化。
- 每一个人选择好心态的时候,就意味着他将要离开人生的谷底。
- 人生的高原期是用来休养生息、深思熟虑和自我更新的时期。
- 峰谷相连不分。今日顺境之错,换得他日逆境;今日逆境之智,换得他日顺境。
其他
如果有带给你一丝丝小快乐,就让快乐继续传递下去,欢迎转载,点赞,顶,欢迎留下宝贵的意见,多谢支持!
6 0
- 优雅编程之这样处理异常,你就“正常”了!
- 优雅编程之这样处理边界,你就“正常”了!
- 优雅编程之这样处理系统,你就“正常”了
- 优雅编程之这样写函数,你就“正常”了!
- 优雅编程之这样注释代码,你就“正常”了!
- 优雅编程之这样取名字,你就"正常"了!
- 优雅编程之这样格式代码,你就"正常了"!
- 优雅编程之这样创建类,你就“正常”了!
- 优雅编程之这样使用CollectionUtils,你就“正常”了
- 优雅编程之这样考虑异常,你就“正常”了(三十一)
- 优雅编程之这样处理继承关系,你就“正常”了(二十六)
- 优雅编程之这样写测试用例,你就”正常“了!
- 优雅编程之这样注重实效,你就“正常”了(十二)
- 优雅编程之这样使用工具,你就“正常”了(十三)
- 优雅编程之这样注重实效,你就“正常”了(十四)
- 优雅编程之这样编写代码,你就“正常”了(十五)
- 优雅编程之这样编写代码,你就“正常”了(十六)
- 优雅编程之这样重构代码,你就“正常”了(十八)
- 八、ActionBar(标题导航操作栏)
- 约瑟夫问题II
- JAVA的IO操作(四)
- 线程间通信-多生产者多消费者(Lock版本)
- July 14th 模拟赛C T4 开花 Solution
- 优雅编程之这样处理异常,你就“正常”了!
- python2.7和python3.4共存
- Java工程师需要掌握哪些知识呢?
- 机器学习中的相似性度量
- send、recv等socket编程接口的阻塞与非阻塞模式.md
- Linux进程通信——共享内存
- MyEclipse安装JS代码提示(Spket插件)
- linux管理员root账号搭建ftp服务怎么让其他账户访问
- HDU 3001 Travelling (状压DP)