为什么有些编程界程序员需要两个显示器?
并非编程界程序员需不要两个显示器。而是编程就要两个甚至连更多个显示器。
我在美国工作啊时,好象的程序员或者开发人员桌子上也是2个以上显示器。
究其原因,要注意是方便啊,两个显示器现在象的windows和显卡都接受,是可以避免来回切屏,方便啊监控状态,都要两个以上屏幕。
(1)比方说你要建议参考别人的代码,写自己的。这时候两个屏幕方便啊吧?
(2)再再者,你要一边望着详细怎么设计的描述,一遍写代码,这时候两个屏幕方便些吧?
(3)再比如说,你必须着边又看了看程序运行结果,一边可以修改程序的功能,这时候两个屏幕方便些吧?
(4)再再者,现在最流行的视频会议,你在旁边开着会,不停地看着远处参考资料,的或c语言设计其他文档。这全是是需要两个屏幕。
(5)再比如说,你要跑多个虚拟店容器的环境,好是是一个虚拟机或容器环境一个显示器吧。
刘嵩
2020.5.19
如何优雅的设计Java异常?
异样的类别
如果说我们所知道的,java中的十分的超类是(后文省略为Throwable),它有两个比较好不重要的子类,(后文省略为Exception)和(后文省略为Error),其中Error由JVM虚拟机进行管理,如我们所人们所熟知的OutOfMemoryError无比等,因此我们本文不参与Error异常,那么我们多说几句一下Exception异样。
Exception极其有个也很重要的子类,叫做RuntimeException。我们将RuntimeException或其他继承自RuntimeException的子类称做非受检异常(unsafeException),其他继承自Exception十分的子类称作受检十分(blockedException)。本文重点来打听一下再看看受检异常和非受检异常这两种无比。
如何中,选择异常
从笔者的开发经验来看,假如在一个应用中,需要开发一个方法(如某个功能的service方法),这个方法假如中间很有可能会出现无比,这样你需要判断这个异样再次出现之后有无动态链接库者也可以处理,但是你有无只希望全局函数者参与处理,要是调用者也可以全面处理,另外你也期望动态链接库者并且处理,那么就要一抛受检十分,警告调用者在不使用你的方法时,考虑到如果没有甩出异常时如果没有参与处理。
相似的,如果没有在写某个方法时,你如果说这是个无意间异样,理论上说,你都觉得运行时很可能会接触什么问题,而这些问题也许也不是必然会不可能发生的,也不是需要内部函数者显示的实际异常来确定业务流程能操作的,那么这时就可以不使用一个RuntimeException这样的非受检无比.
行了,估记我上边说的这段话,你读了很多遍也却觉得晦涩了。
那么,请跟着一起我的思路,在慢慢地理解透一下。
什么时候才需要抛无比
简单的方法我们要打听一下一个问题,什么时候才必须抛异常?十分的设计是方便些给开发者建议使用的,但不是乱是用,笔者是对什么时候抛异样这个问题也问了很多朋友,能决定准确答案的的确不是太多。当然这个问题很简单的,如果你觉着某些”问题”解决不了了,这样你就也可以丢出十分了。
.例如,你在写一个service,其中在在写某段代码处,你发现到可能会会再产生问题,那就就请掷下十分吧,不会相信我,你此时抛出异样将是一个最佳时机。
肯定甩出怎样的异样
了解完了什么时候才必须抛出异常后,我们再认真的思考一个问题,真有当我们一抛异常时,我们应该是选用天然整样的极其呢?到底是是受检无比我还是非受检无比呢(RuntimeException)呢?
我来举例子那说明一下这个问题,先从受检无比你说起,假如有这样的一个业务逻辑,需要从某文件中读取数据某个数据,这个读取能操作可能是而文件被删掉等其它问题可能导致根本无法声望兑换最大限度地直接出现读取文件错误,那你就要从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如下:
Userdomaacross::
行啦,上边是一个模型关系,用户-收货地址的关系是1-n的关系。上边的@Data是建议使用了一个就是lombok的工具,它自动导入了Setter和Getter等方法,用起来十分方便,感兴趣的东西读者这个可以自身清楚一下。
dao能介绍
数据连接层,我们不使用了spring-data-jpa这个框架,它要求我们只不需要不能继承框架需要提供的接口,因此通过约定对方法并且起名,就是可以能完成我们打算的数据库操作。
用户数据库操作::
收货地址操作追加:
如果说读者所见到的,我们的DAO只需要继承JpaRepository,它就巳经帮我们能完成了基本都的CURD等你的操作,如果没有想清楚更多关与spring-data的这个项目,请做个参考再看看spring的官方文档,它比不方案我们对异常的研究。
Service十分设计
ok,又一次到了我们的重点了,我们要结束service一些的部分操作:直接添加收货地址,删除收货地址,查看收货地址列表.
简单的方法看我的service接口定义:
我们来参与看看实现程序:
再添加收货地址
首先再来去看看之前收拾好的约束条件:
入参:
用户id
收货地址实体信息
约束:
用户id肯定不能为空,且此用户倒是是未知的
收货地址的没必要字段不能不能为空
假如用户还没有收货地址,当此收货地址创建角色时系统设置成默认收货地址
先看以下代码实现方法:
其中,巳经结束了上列所详细解释的三点约束条件,当三点约束条件都满足时,才可以不并且正常业务逻辑,不然的话将丢出极其(一般在此处见意丢出运行时极其-RuntimeException)。
介绍以上以上我所要用的技术:
1、(T t)这个是可以使用Guava中的进行确认的,只不过service中会用到的验正较容易,所以我我建议你将Preconfitions改动态和静态导入的
不过Guava的github中的那就证明也建议我们那样的话可以使用。
2、(validator,address)这个建议使用了hibernate实现程序的jsr303规范来做的,不需要传遍一个validator和一个需要不验证的实体,那么validator是怎么获取的呢,万分感谢:
他将查看一个Validator对象,然后我们在service中并且吸纳便可以不不使用了:
那就BeanValidators这个类是该如何基于的?不过实现很简单的,如果去推测jsr303的标出注解就就ok啦了。
这样的话jsr303的注解写在哪里了呢?肯定是写在address实体类中了:
上一篇:花呗关闭后开通不了怎么解决(为什么花呗关了之后再开就用不了)
下一篇:返回列表