json怎么把对象转换成io流 如何优雅的设计Java异常?
如何优雅的设计Java异常?
异样的类别
正如我们所知道的,java中的异样的超类是(后文省略为Throwable),它有两个也很有用的子类,(后文省略为Exception)和(后文省略为Error),其中Error由JVM虚拟机参与管理,如我们所熟知的OutOfMemoryError无比等,所以我们本文不查哈Error极其,那就我们多说几句再看看Exception异样。
Exception异样有个比较不重要的子类,叫做什么RuntimeException。我们将RuntimeException或其他继承自RuntimeException的子类称做非受检异常(uncheckedException),其他继承自Exception十分的子类被称受检异样(pausedException)。本文重点来打听一下一下受检异常和非受检极其这两种无比。
该如何选择异常
从笔者的开发经验来看,如果没有在一个应用中,不需要变更土地性质一个方法(如某个功能的service方法),这个方法如果没有中间肯定出现十分,那就你不需要决定这个异样出现之后是否需要全局函数者是可以如何处理,但是你有无希望动态链接库者通过处理,要是调用者可以如何处理,并且你也期望动态链接库者并且处理,那么还得抛出受检极其,提醒调用者在在用你的方法时,考虑到到假如丢出异常时如果不是参与处理。
相似的,如果没有在写某个方法时,你其实这是个偶然无比,理论上说,你觉着运行时很有可能会出现什么问题,而这些问题也许是又不是必然发生的,也不要内部函数者会显示的按照异常来确定业务流程你操作的,这样这时就也可以不使用一个RuntimeException这样的非受检异样.
行了,估计也我上边说的这段话,你读了很多遍也却觉着艰涩了。
那么,请跟着走我的思路,在渐渐仔细体会一下。
什么时候才需要抛异样
简单的方法我们是需要知道一点一个问题,什么时候才不需要抛异常?无比的设计是方便些给开发者使用的,但也不是乱专用,笔者相对于什么时候抛异常这个问题也问了很多朋友,能决定确切答案的倒是不太多。其实这个问题很简单,如果你感觉某些”问题”帮忙解决不了了,那么你就也可以一抛异常了。
例如,你在写一个service,其中在不写某段代码处,你才发现可能会产生问题,那么就请掷下极其吧,相信我,你此时一抛极其将是一个最佳的位置时机。
应该掷下整样的极其
知道一点完了什么时候才不需要甩出异常后,我们再琢磨一个问题,真有当我们掷下异常时,我们应该最好选择怎么样才能的异常呢?到底是是受检极其应该非受检无比呢(RuntimeExceptiin)呢?
我来请解释下这个问题,先从受检无比你说起,假如有那样的话一个业务逻辑,需要从某文件中无法读取某个数据,这个加载能操作很有可能是导致文件被删出等其他的问题导致没能某些最终达到再次出现读取文件错误,那么还得从redis或mysql数据库中再去资源此数据,参考追加代码,getKey(Integer)为入口程序.
ok,看了以上代码以后,你也许你心中有一些想法,原来是受检异常可以不操纵义务逻辑,对,是啊,受检极其是真的是可以完全控制业务逻辑,可是千万要记住不要那样建议使用,我们应该合不合理的一抛异常,毕竟程序本身才是流程,极其的作用仅仅是当你参与不下去的时候不能找到的一个借口罢了,它并不能不能当作完全控制程序流程的入口或出口,要是这样在用的话,是在将异样的作用不断扩大化,这样的话很快就会倒致代码复杂程度的增加,耦合性会想提高,代码可读性降低等问题。
这样就一定别不使用这样的异常吗?不过也不是,在真有有这样的需求的时候,我们也可以那样的话使用,仅仅切记,最好不要把它确实充当完全控制流程的工具或手段。这样的话到底是什么时候才要抛出这样的异常呢?要考虑,假如全局函数者全局函数错误后,一定要让动态链接库者对于错误通过处理才可以不,满足的条件这样的要求时,我们就会考虑到在用受检极其。
接下来,我们来看帮一下忙非受检极其呢(RuntimeException),对于RuntimeException这种异样,我们总之很多见,例如/等,这样的话这种异常我们时候甩出呢?
当我们在写某个方法的时候,很可能会无意间遇到了某个错误,我们其实这个问题时运行时很有可能为发生的,因此理论上讲,没有这个问题的话,程序将是都正常不能执行的时候,它不强制破军具体的要求全局函数者一定得捕捉猎物这个十分,此时掷下RuntimeException极其。
举个例子,当传来一个路径的时候,是需要回一个路径对应的File对象:
本案所涉例子并且,如果动态链接库者动态创建getFiles(String)的时候假如path是空,那你就甩出空指针异样(它是RuntimeException的子类),调用者不需要总是显示的接受try…catch…操作接受强制破军处理.这就特别要求全局函数者在动态链接库这样的方法时先通过验证验证,以免再一次发生RuntimeException.万分感谢:
估计最好选择哪种异样
实际以上的描述和举例说明,这个可以总结出一个结论,RuntimeException异常和受检异常之间的区别就是:如何确定强制没有要求调用者必须全面处理此极其,假如强制破军具体的要求动态创建者可以通过处理,那你就建议使用受检极其,不然就你选择非受检十分(RuntimeException)。好象来讲,如果没有没有特珠的要求,我们我建议你在用RuntimeException十分。
场景能介绍和技术选型架构描述
如果说我们所知,民间的项目大都以MVC框架为基础通过变更土地性质的,本文通常从不使用restful风格接口的设计来体验帮一下忙异常处理的优雅。
我们把关注点放进restful的api层(和web中的controller层相似)和service层,去研究看看在service中如何一抛十分,然后再api层该如何并且去捕获而且被转化异常。
可以使用的技术是:spring-boot,jpa(hibernate),mysql,如果不是对这些技术不是太清楚,读者要自行阅读理解相关材料。
业务场景描述
选择类型一个都很很简单业务场景,以电商中的收货地址管理为例,用户在移动端参与购买商品时,必须接受收货地址管理,在项目中,需要提供一些给移动端接受访问的api接口,如:再添加收货地址,删掉收货地址,可以修改收货地址,默认收货地址设置,收货地址列表可以查询,单个确认发货地址查询等接口。
统合约束条件
行啦,这个是设置里好的一个很基本是的业务场景,其实,无论什么样的api操作,其中都真包含一些规则:
直接添加收货地址:入参:
用户id
收货地址实体信息
管理和约束:
用户id肯定不能为空,且此用户的确是必然的
收货地址的必要的话字段不能不能为空
假如用户还没有收货地址,当此收货地址创建家族时可以设置成默认收货地址—
删除掉收货地址:入参:
用户id
收货地址id
管理和约束:
用户id又不能为空,且此用户的确是必然的
收货地址没法为空,且此收货地址的确是修真者的存在的
推测此收货地址是否是用户的收货地址
确认此收货地址有无为默认收货地址,如果没有是设置为收货地址,那你不能进行删掉
改收货地址:入参:
用户id
收货地址id
管理和约束:
用户id不能不能为空,且此用户确实是是存在地的
收货地址不能为空,且此收货地址的确是未知的
推测此收货地址有无是用户的收货地址
设置成地址设置:入参:
用户id
收货地址id
加以约束:
用户id不能为空,且此用户倒是是未知的
收货地址不能为空,且此收货地址倒是是存在地的
推测此收货地址有无是用户的收货地址
收货地址列表网上查询:入参:
用户id
约束:
用户id不能不能为空,且此用户确实是修真者的存在的
单个收到货地址查询:入参:
用户id
收货地址id
强制力:
用户id肯定不能为空,且此用户的确是存在的
收货地址又不能为空,且此收货地址确实是是存在地的
确定此收货地址是否是是用户的收货地址
管理和约束判断和技术选型
是对上述列个的约束条件和功能列表,我你选几个比较典型的异常处理场景参与分析:添加收货地址,彻底删除收货地址,声望兑换收货地址列表。
那么应该是有哪些必要的知识储备呢,让我们去看看收货地址这个功能:
直接添加收货地址中不需要对用户id和收货地址实体信息就行校验,这样这对非空的判断,我们怎么通过工具的选择呢?民间的判断::
上边的例子,假如只可以确定uid为空而且,假如再去确认address这个实体中的某些必要属性是否是为空,在字段很多的情况下,这无非是灾难性的。
那我们肯定咋参与这些入参的判断呢,给大家详细介绍两个知识点:
Guava中的Preconditions类实现了很多入参方法的判断
jsr303的validation规范(目前利用都很全的是hibernate利用的hibernate-validator)
如果没有建议使用了这两种帮我推荐技术,这样的话入参的判断会变的简单啊比较多。我推荐大家多使用这些成熟的技术和jar工具包,他可以不降低很多不必要的工作量。我们只不需要把重心放业务逻辑上。而不会而且这些入参的判断误了更多的时间。
要如何优雅的设计java异样domain推荐
根据项目场景来看,需要两个domain模型,一个是用户实体,一个是地址实体.
Addressdomain万分感谢:
Userdomain追加:
可以啦,上边是一个模型关系,用户-收货地址的关系是1-n的关系。上边的@Data是在用了一个叫作lombok的工具,它自动生成报表了Setter和Getter等方法,用起来特别方便,很有兴趣读者是可以自行打听一下再看看。
dao介绍
数据连接上层,我们不使用了spring-data-jpa这个框架,它特别要求我们只是需要可以继承框架提供给的接口,另外按照约定对方法通过取名字,就这个可以能完成我们是想的数据库操作。
用户数据库操作不胜感激:
收货地址操作不胜感激:
如果说读者所看到的,我们的DAO只是需要不能继承JpaRepository,它就早就帮我们完成了都差不多的CURD等能操作,如果没有想打听一下大量麻烦问下spring-data的这个项目,请相关参考再看看spring的官方文档,它比不方案我们对异常的研究。
Service无比设计
行啦,又一次到了我们的重点了,我们要成功service一些的部分操作:添加收货地址,删掉收货地址,获取收货地址列表.
简单看我的service接口定义:
我们来了解再看看利用:
添加收货地址
首先我来看一下之前整理的约束条件:
入参:
用户id
收货地址实体信息
加以约束:
用户id不能为空,且此用户虽然是修真者的存在的
收货地址的必要的话字段不能为空
如果不是用户还没有收货地址,当此收货地址修改时设置成默认收货地址
先看200元以内代码实现方法:
其中,已经完成了根据上述规定所描述的三点约束条件,当三点约束条件都满足时,才这个可以通过正常业务逻辑,不然将丢出异样(就像在此处建议您丢出运行时十分-RuntimeException)。
能介绍100元以内以上我所应用的技术:
1、(T t)这个是在用Guava中的通过推测的,因为service中应用的验证较少,所以才建议将Preconfitions改静态导入的
当然了Guava的github中的那说明也建议我们这样的在用。
2、(validator,address)这个在用了hibernate实现程序的jsr303规范来做的,需要传来一个validator和一个不需要修改密保的实体,那么validator是如何能查看的呢,如下:
他将某些一个Validator对象,后再我们在service中参与注入便这个可以使用了:
这样的话BeanValidators这个类是如何能实现程序的?总之基于很简单,如果去确认jsr303的上标注解就就ok啦了。
那就jsr303的注解写在哪里了呢?当然是写在address实体类中了:
java好学吗?该怎么学?
笔者另外一个在一线互联网公司从事外贸几千年Java服务端的开发人员,又是从零基础一路学习过去的,据自己的认知对您提的问题并且简单啊解答:
Java究竟有没有到底好不好学答案是:并不难学。很多人都我以为编程是个很高深的法术的东西,那就错了,真正的自学了然后你就会发现编程比你高中学的数理化要简单多。说它不算难呢,假如学进入到了,算是有很多东西要学习,例如你学Java,后面很有可能要了解计算机组成原理、操作系统等底层知识,其实这些知识只要都要用心去了解,还是我们一般人都这个可以表述的。
Java学习途径说到一门知识或技能好不好啊用,学习途径是很重要的,如果不是也没自学途径,有的时候一个很简单点的知识都要花很多年搞清楚。我们是踩在巨人的肩上的,老一辈人给我留下了很多宝贵知识这些经验,所以才我们的学习途径更加多。
Java相关书籍:最比较传统的学习途径,优点那是知识点很全面,缺点是有些知识点不仅靠不看书不好解释。帮我推荐书籍:Java编程思想。Java具体视频教程:大部分程序员自学的途径,优点是有老师面带怎么学习,易理解一些难解释的知识,只不过大部分教程内容不国家公综合教材,国家公综合教材的需要需要付费。帮我推荐视频:java初学者高淇Java300集视频。Java官方文档:这一般是技术大佬选择的学习途径,优点是很很权威,缺点是英文文档极少部分,相对来说枯燥无趣。很少人想读书好差不多去读,大部分以及像字典一样去查阅。Java查找技术文章:很多开发人员都有写技术博客的习惯,一是做怎么学习或经验总结,二也是最重要的,就是可以展示个人实力(嘿)。这种学习就必须自己去判别技术文章的质量了,有的文章真的很赞,不过有的文章会误导别人人。我推荐技术博客网站:CSDN、博客园。当然有很多学习途径,就不一一列举了。这么多多的学习途径,就算再难的知识也会变地并并非很难了,反正Java的确即使一门中等偏下难度的高级编程语言,就更提不上有多难了。
后来说这么多多,全是在解释Java却没这么难。要是您肯定不不会相信,可以不努力思考下我想知道为什么会孕育而出出这么多Java培训机构,但专业培训的人好多是高中、大专的同学,而且他们也会有比较好不错的工作。很肯定,学习Java的难度不是很大,起点也不高,只需你肯学,当然比高中学的数理化很简单。
笔者是两名无比热爱互联网、无比热爱互联网技术、热于多多分享的年轻人,如果您跟我完全不一样,我不会愿意曾经的您的朋友,能分享每一个流通价值知识给您。很喜欢作者的同学,点zan再转发了解哦!
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。