游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

Java到底能不能使用异常来控制流程?

  前言
  我们经常在很多项目里面看到用异常来处理业务逻辑,发现不符合预期直接抛出异常,然后在最外面捕获异常统一处理,这样使用非常方便。
  但是又有很多文章写着异常处理性能,所以不建议使用异常来做流程控制。甚至在阿里巴巴开发手册里面明确说明了,不要用来做流程控制。
  那么问题来了:
  究竟能不能用异常来做流程控制?效率低是低多少?看完这一篇文章你就知道了。开始测试先做最简单的测试
  我们循环10万次,然后栈有5层,然后输出返回结果。privatestaticfinalintRUNCOUNT1010000;测试异常耗时输出异常堆栈信息TestpublicvoidprintStack(){longstart1System。currentTimeMillis();for(inti0;iRUNCOUNT;i){log。info(Storey1。test());}longstart2System。currentTimeMillis();for(inti0;iRUNCOUNT;i){try{Storey1。testException();}catch(Exceptione){log。info(e。getMessage(),e);}}longendSystem。currentTimeMillis();log。info(普通返回耗时:{},异常返回耗时:{},start2start1,endstart1);}publicstaticclassStorey1{publicstaticStringtest(){returnStorey2。test();}publicstaticStringtestException(){returnStorey2。testException();}}publicstaticclassStorey2{publicstaticStringtest(){returnStorey3。test();}publicstaticStringtestException(){returnStorey3。testException();}}publicstaticclassStorey3{publicstaticStringtest(){returnStorey4。test();}publicstaticStringtestException(){returnStorey4。testException();}}publicstaticclassStorey4{publicstaticStringtest(){returnStorey5。test();}publicstaticStringtestException(){returnStorey5。testException();}}publicstaticclassStorey5{publicstaticStringtest(){returnInteger。toString(count);}publicstaticStringtestException(){thrownewCustomException(Integer。toString(count));}}publicstaticclassCustomExceptionextendsRuntimeException{publicCustomException(Stringmessage){super(message);}}
  结果差别很大,普通返回只要2137毫秒,而异常却要75026毫秒,几十倍的差距。15:07:59。648〔main〕INFOcom。alibaba。easytools。test。temp。exception。ExceptionTest普通返回耗时:2137,异常返回耗时:75026不输出堆栈信息
  聪明的同学不难发现,上面有个变量没控制住,就是使用异常的情况下,输出了堆栈信息,那我们关闭堆栈输出试试。会不会是输出的堆栈信息导致的慢呢?测试异常耗时仅仅输出信息Testpublicvoidprint(){longstart1System。currentTimeMillis();for(inti0;iRUNCOUNT;i){log。info(Storey1。test());}longstart2System。currentTimeMillis();for(inti0;iRUNCOUNT;i){try{Storey1。testException();}catch(Exceptione){log。info(e。getMessage());}}longendSystem。currentTimeMillis();log。info(普通返回耗时:{},异常返回耗时:{},start2start1,endstart1);}
  结果发现普通返回是2053毫秒,而异常却要4380毫秒,发现差距瞬间变小了。15:43:54。260〔main〕INFOcom。alibaba。easytools。test。temp。exception。ExceptionTest普通返回耗时:2053,异常返回耗时:4380不输出任何信息
  显然我们发现,关闭了日志输出对执行时间影像很大,那我们关闭了日志输出会有什么效果了呢?测试异常耗时不输出信息TestpublicvoidnoPrint(){longstart1System。currentTimeMillis();for(inti0;iRUNCOUNT;i){Storey1。test();}longstart2System。currentTimeMillis();for(inti0;iRUNCOUNT;i){try{Storey1。testException();}catch(Exceptione){}}longendSystem。currentTimeMillis();log。info(普通返回耗时:{},异常返回耗时:{},start2start1,endstart1);}
  结果发现普通返回是58毫秒,而异常却要719毫秒,看来性能实际差距就是十几倍。15:47:55。901〔main〕INFOcom。alibaba。easytools。test。temp。exception。ExceptionTest普通返回耗时:58,异常返回耗时:719关闭堆栈
  在处理异常的时候,很多时间在封装异常堆栈,那有没有办法可以不要封装呢?
  仔细研究异常类发现,异常类有个参数writableStackTrace可以让异常不去封装堆栈信息。publicclassRuntimeExceptionextendsException{Constructsanewruntimeexceptionwiththespecifieddetailmessage,cause,suppressionenabledordisabled,andwritablestacktraceenabledordisabled。parammessagethedetailmessage。paramcausethecause。(A{codenull}valueispermitted,andindicatesthatthecauseisnonexistentorunknown。)paramenableSuppressionwhetherornotsuppressionisenabledordisabledparamwritableStackTracewhetherornotthestacktraceshouldbewritablesince1。7protectedRuntimeException(Stringmessage,Throwablecause,booleanenableSuppression,booleanwritableStackTrace){super(message,cause,enableSuppression,writableStackTrace);}}
  我们把抛异常的时候不去封装异常信息测试异常耗时关闭堆栈并且不打印TestpublicvoidnoPrintCloseStackTrace(){longstart1System。currentTimeMillis();for(inti0;iRUNCOUNT;i){Storey1。test();}longstart2System。currentTimeMillis();for(inti0;iRUNCOUNT;i){try{Storey1。testException();}catch(Exceptione){}}longendSystem。currentTimeMillis();log。info(普通返回耗时:{},异常返回耗时:{},start2start1,endstart1);}publicstaticclassStorey5{publicstaticStringtest(){returnInteger。toString(count);}publicstaticStringtestException(){thrownewCustomException(Integer。toString(count),null,false,false);}}publicstaticclassCustomExceptionextendsRuntimeException{publicCustomException(Stringmessage){super(message);}publicCustomException(Stringmessage,Throwablecause,booleanenableSuppression,booleanwritableStackTrace){super(message,cause,enableSuppression,writableStackTrace);}}
  结果发现普通返回是31毫秒,而异常却要62毫秒,差距也没有想象中的大了。差不多是2倍左右。15:54:26。984〔main〕INFOcom。alibaba。easytools。test。temp。exception。ExceptionTest普通返回耗时:31,异常返回耗时:62最终结果
  我们来看下最终对比结论
  普通
  异常
  普通输出日志,异常输出堆栈
  2137hr75026hr普通输出日志,异常仅输出日志
  2053hr4380hr都不输出日志
  58hr719hr关闭堆栈
  31hr62结论
  所以我们可以总结出以下结论日志输出堆栈非常耗时哪怕日志只是输出业务逻辑,耗时和业务处理也不是一个时间维度的排出日志影响,封装堆栈非常耗时关闭堆栈以后耗时相差不大,大概1万次相差3毫秒
  三种方式优缺点总结下:
  优点
  缺点
  普通最快速嵌套深了,或者有返回值的情况下代码会比较丑陋如果打印了请求日志,多个地方返回相同值,不好排查
  关闭堆栈的异常相对速度还行代码相对书写比较方便有时候不打印堆栈多个地方返回相同值,不好排查
  不关闭堆栈的异常代码相对书写比较方便能打印整个堆栈信息,非常容易定位问题速度慢
  如果我们的并发没有大到必须关闭日志这种情况下,实际上来说异常来控制流程问题不大,影响微乎其微,所以还是怎么方便怎么来。
  当然如果项目并发超级高,高到单机1万次请求要省3毫秒的情况下,建议还是用返回去控制业务流程。大家平时项目有没有用异常来控制流程呢?欢迎留言讨论。

湖人3换2报价保罗!詹姆斯有望联手最佳控卫,湖人扬帆起航了?报价背景湖人在詹眉合砍55分的情况下,艰难赢下一场宝贵的胜利,战绩来到24胜28负,虽然还排在西部第13,但是至少没有掉队,接下来他们将挑战东部附加赛区的步行者、9连败的……苹果watchOS7。1开发者预览版Beta1发布感谢IT之家网友孟孟的安安的线索投递!IT之家9月18日消息今日凌晨,除iOS14。2与iPadOS14。2开发者预览版Beta1外,苹果还向开发人员发布了watchOS……欧盟考虑发布新规ApplePay技术可能会向竞争对手开放欧盟正在考虑出台新规定,可能要求苹果公司向竞争对手提供iPhone内置的支付技术。根据媒体获得的一份文件显示,欧盟的新规将阻止移动设备制造商限制智能手机和智能手表等其他设……苹果新款磁性充电垫产品谍照曝光IT之家9月18日消息据Macrumors报道,有消息称在AirPower项目被叫停后,苹果公司仍在继续开发某种无线充电垫产品,9to5Mac收到了一段声称介绍了苹果公司的磁性……全网首发3D人脸解锁领跑者,德施曼Q50FPro新品智能锁评了解我的小伙伴知道,近期我的新房在装修,目前已经接近尾声,到了该选择智能锁的阶段,作为一名活跃在数码科技类前沿的我而言,选择一款好的智能锁成为了现阶段的首要任务,当下智能锁品类……苹果iPadAir4iPad8发布,中信证券预计今年iPadIT之家9月16日消息9月16日凌晨,苹果举行了2020秋季新品发布会,发布了两款iPad和两款AppleWatch,但没有iPhone12手机出现。IT之家报道,苹果这……西游情结在《西游女国奇缘》中,开放了三个不同级别的多人副本供玩家挑战。玩家可在副本仙子处进入副本,根据不同等级选择不同的副本内容,玩家通关副本可获得多种奖励,多次闯关还可获得侠义值。具……苹果发布iPadAir4iPad8AppleWatchSerIT之家9月16日消息9月16日凌晨,苹果举行了2020秋季新品发布会,发布了两款iPad和两款AppleWatch,但没有iPhone12手机出现。具体内容可看《苹果2020……看了北京街拍,才懂什么是真正的名媛风,不染彩发一身干净在过去,我们把名门贵族的女孩称为名媛,她们无论是长相气质打扮,看着都比普通人惊艳。如今时代变了,众生平等,人人都可以穿得像小公主,结果名媛二字就被大家玩儿坏了,但凡带点蕾丝花边……春天吃茼蒿,被称作皇帝菜,营养价值位列前茅春天是茼蒿丰收的季节,这个被誉为皇帝菜的蔬菜,营养价值是众蔬菜中名列前茅的,而且又多种多样的做法,营养特别高,正适合这个季节吃!一、茼蒿的营养价值茼蒿在早些时候,都……继Chrome后,微软Edge浏览器现已支持设置为iOS14感谢IT之家网友帥科的线索投递!IT之家9月14日消息苹果上周推送了iOS14beta8版本的更新,其中一项特性是支持将Chrome设定为默认浏览器。据网友反馈,微软Ed……苹果watchOS7推出家人共享没有iPhone,AppleIT之家9月16日消息Apple今日宣布watchOS7将推出家人共享设置功能,让家里没有iPhone的孩子和老人们也能畅享AppleWatch在沟通、健康、健身和安全等方面的……
访古探幽天水伏羲庙2022(壬寅)年公祭中华人文始祖伏羲大典现场。新甘肃甘肃日报通讯员周文涛(本版图片均为资料图)先天殿文伍振丝绸之路西入甘肃,第一个重镇就是中国历史文化名城天……喜讯连连!云米智能家居套装斩获两项权威大奖近日,云米智能家居套装系列喜讯频传,先后在70多个国家、数千件产品的年度大角逐中脱颖而出,斩获德国RedDotWinner2022设计大奖,此前不久,云米智能家居套系还获得国家……阳了要忌嘴!牢记3多吃,3不吃,4多做,有助于身体恢复最近身边的人一个又一个进入羊圈,有的人一周左右就转阴,有的人需要三周左右才转阴,这都是正常现象。阳了之后,我们也不要慌张,除了吃药、喝水,正常吃饭和合理饮食也是必不可少的。但是……跨境卖家踏入这三个误区,花再多广告费也于事无补网络上关于亚马逊运营的内容很多,比如做亚马逊如何选品,如何定价等等,比如下面这几篇分享但是为什么我们看了这么多关于亚马逊如何运营的内容,广告打了又打,却还是销量如旧,甚至……木耳切记不要用清水泡,多加2样,泡发只需3分钟,清脆爽口又解感谢压力吧,压力并不是绝对的坏事,它会激发人的斗志,促进人的成长,压力也能产生动力,在压力的作用下,往往能够找到快速解决问题的方法。比如泡发木耳,前几日,家里人去知名连锁……篮网输公牛!杜兰特奥尼尔52分,渡边赵四贡献全部,欧文12中北京时间11月2号杜兰特和公牛的比赛,这场比赛是纳什下课的第一场比赛,不过因为背靠背,篮网主力球员确实非常累。而且末节杜兰特休息了一段时间之后,篮网直接被公牛反超。再加上体能下……世风评判下,朱之文儿子的结婚,又将是个人间笑话?大衣哥朱之文,早年凭借一身独特的大军衣穿着,一口响亮的歌喉。瞬间在央视走红,也红遍了大江南北。大衣哥成名后,身价是水涨船高,年收入也堪比一线明星。成名富裕后的大衣哥,他的……中小学科学教育的落后是华为芯片被美国卡脖子最重要的原因几千年来,中华民族一直领先于世界,但是数百年来,由于重文轻理和其他的一些原因,中国在世界上落后了,落后的根源就在于科学。世界范围内的经济竞争、综合国力的竞争,实际上是科学技术的……最终幻想7重制版PC与PS5对比画质对比《最终幻想7:重制版》最早于2020年4月10日登陆PS平台,目前《最终幻想7:重制版Intergrade》也已登陆PC。油管频道ElAnalistaDeBits公开了本作PS……女性常犯的6个穿衣错误,想看起来更年轻,就别再犯了我们都想看起来美丽、性感和年轻。我们不能改变我们的年龄,但我们可以避免一些让我们感觉和看起来更老的穿衣错误。下面有六个我相信我们都会犯的穿衣错误,如果我们想看起来更年轻、更新鲜……6700余人被1人害死白白牺牲,志愿军38军兵败白马山,发生1952年10月3号,南韩白马山阵地上,驻守的南韩士兵忽然发现,有一名志愿军军官举起双手,正朝自己走来。负责警戒的南韩士兵立刻冲了上去,将这把军官拘押,随后便被南韩政府,……4月13日币圈币圈4月份最新提现困难项目黑名单1、赞丽生活赞丽生活这帮人打鸡血功夫还是牛逼的,跌个50,声称团队在做事,这是底了。涨个1,就高喊要起飞。还tmd卖房抄底,也就你们这些傻X喊的出来。现在赞丽积分已经来到……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网