亚洲av成人精品日韩一区,97久久久精品综合88久久,玩弄japan白嫩少妇hd,亚洲av片不卡无码久久,玩弄人妻少妇500系列

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Java中使用try catch會(huì)嚴(yán)重影響性能?

倩倩 ? 來(lái)源:CSDN ? 作者:CSDN ? 2022-09-08 10:51 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群


前言

不知道從何時(shí)起,傳出了這么一句話:Java中使用try catch 會(huì)嚴(yán)重影響性能。

然而,事實(shí)真的如此么?我們對(duì)try catch 應(yīng)該畏之如猛虎么?

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

一、JVM 異常處理邏輯

Java 程序中顯式拋出異常由athrow指令支持,除了通過(guò) throw 主動(dòng)拋出異常外,JVM規(guī)范中還規(guī)定了許多運(yùn)行時(shí)異常會(huì)在檢測(cè)到異常狀況時(shí)自動(dòng)拋出(效果等同athrow), 例如除數(shù)為0時(shí)就會(huì)自動(dòng)拋出異常,以及大名鼎鼎的 NullPointerException 。

還需要注意的是,JVM 中 異常處理的catch語(yǔ)句不再由字節(jié)碼指令來(lái)實(shí)現(xiàn)(很早之前通過(guò) jsr和 ret指令來(lái)完成,它們?cè)诤茉缰暗陌姹纠锞捅簧釛壛?,現(xiàn)在的JVM通過(guò)異常表(Exception table 方法體中能找到其內(nèi)容)來(lái)完成 catch 語(yǔ)句;很多人說(shuō)try catch 影響性能可能就是因?yàn)檎J(rèn)識(shí)還停留于上古時(shí)代。

1.我們編寫如下的類,add 方法中計(jì)算 ++x; 并捕獲異常。

publicclassTestClass{
privatestaticintlen=779;
publicintadd(intx){
try{
//若運(yùn)行時(shí)檢測(cè)到x=0,那么jvm會(huì)自動(dòng)拋出異常,(可以理解成由jvm自己負(fù)責(zé)athrow指令調(diào)用)
x=100/x;
}catch(Exceptione){
x=100;
}
returnx;
}
}

2.使用javap 工具查看上述類的編譯后的class文件

#編譯
javacTestClass.java
#使用javap查看add方法被編譯后的機(jī)器指令
javap-verboseTestClass.class

忽略常量池等其他信息,下邊貼出add 方法編譯后的 機(jī)器指令集:

publicintadd(int);
descriptor:(I)I
flags:ACC_PUBLIC
Code:
stack=2,locals=3,args_size=2
0:bipush100//加載參數(shù)100
2:iload_1//將一個(gè)int型變量推至棧頂
3:idiv//相除
4:istore_1//除的結(jié)果值壓入本地變量
5:goto11//跳轉(zhuǎn)到指令:11
8:astore_2//將引用類型值壓入本地變量
9:bipush100//將單字節(jié)常量推送棧頂<這里與數(shù)值100有關(guān),可以嘗試修改100后的編譯結(jié)果:iconst、bipush、ldc>
10:istore_1//將int類型值壓入本地變量
11:iload_1//int型變量推棧頂
12:ireturn//返回
//注意看from和to以及targer,然后對(duì)照著去看上述指令
Exceptiontable:
fromtotargettype
058Classjava/lang/Exception
LineNumberTable:
line6:0
line9:5
line7:8
line8:9
line10:11
StackMapTable:number_of_entries=2
frame_type=72/*same_locals_1_stack_item*/
stack=[classjava/lang/Exception]
frame_type=2/*same*/

再來(lái)看 Exception table

751faf10-2f1f-11ed-ba43-dac502259ad0.png

from=0, to=5。指令 0~5 對(duì)應(yīng)的就是 try 語(yǔ)句包含的內(nèi)容,而targer = 8 正好對(duì)應(yīng) catch 語(yǔ)句塊內(nèi)部操作。

個(gè)人理解,from 和 to 相當(dāng)于劃分區(qū)間,只要在這個(gè)區(qū)間內(nèi)拋出了type 所對(duì)應(yīng)的,“java/lang/Exception” 異常(主動(dòng)athrow 或者 由jvm運(yùn)行時(shí)檢測(cè)到異常自動(dòng)拋出),那么就跳轉(zhuǎn)到target 所代表的第八行。

若執(zhí)行過(guò)程中,沒(méi)有異常,直接從第5條指令跳轉(zhuǎn)到第11條指令后返回,由此可見(jiàn)未發(fā)生異常時(shí),所謂的性能損耗幾乎不存在;

如果硬是要說(shuō)的話,用了try catch 編譯后指令篇幅變長(zhǎng)了;goto 語(yǔ)句跳轉(zhuǎn)會(huì)耗費(fèi)性能,當(dāng)你寫個(gè)數(shù)百行代碼的方法的時(shí)候,編譯出來(lái)成百上千條指令,這時(shí)候這句goto的帶來(lái)的影響顯得微乎其微。

如圖所示為去掉try catch 后的指令篇幅,幾乎等同上述指令的前五條。

752a35ac-2f1f-11ed-ba43-dac502259ad0.png

綜上所述:“Java中使用try catch 會(huì)嚴(yán)重影響性能” 是民間說(shuō)法,它并不成立。 如果不信,接著看下面的測(cè)試吧。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://gitee.com/zhijiantianya/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

二、關(guān)于JVM的編譯優(yōu)化

其實(shí)寫出測(cè)試用例并不是很難,這里我們需要重點(diǎn)考慮的是編譯器的自動(dòng)優(yōu)化,是否會(huì)因此得到不同的測(cè)試結(jié)果?

本節(jié)會(huì)粗略的介紹一些jvm編譯器相關(guān)的概念,講它只為更精確的測(cè)試結(jié)果,通過(guò)它我們可以窺探 try catch 是否會(huì)影響JVM的編譯優(yōu)化。

前端編譯與優(yōu)化 :我們最常見(jiàn)的前端編譯器是 javac,它的優(yōu)化更偏向于代碼結(jié)構(gòu)上的優(yōu)化,它主要是為了提高程序員的編碼效率,不怎么關(guān)注執(zhí)行效率優(yōu)化;例如,數(shù)據(jù)流和控制流分析、解語(yǔ)法糖等等。

后端編譯與優(yōu)化 :后端編譯包括 “即時(shí)編譯[JIT]” 和 “提前編譯[AOT]”,區(qū)別于前端編譯器,它們最終作用體現(xiàn)于運(yùn)行期,致力于優(yōu)化從字節(jié)碼生成本地機(jī)器碼的過(guò)程(它們優(yōu)化的是代碼的執(zhí)行效率)。

1. 分層編譯

PS * JVM 自己根據(jù)宿主機(jī)決定自己的運(yùn)行模式, “JVM 運(yùn)行模式”;[客戶端模式-Client、服務(wù)端模式-Server],它們代表的是兩個(gè)不同的即時(shí)編譯器,C1(Client Compiler)C2 (Server Compiler)。

PS:分層編譯分為:“解釋模式”、“編譯模式”、“混合模式”;

解釋模式下運(yùn)行時(shí),編譯器不介入工作;

編譯模式模式下運(yùn)行,會(huì)使用即時(shí)編譯器優(yōu)化熱點(diǎn)代碼,有可選的即時(shí)編譯器[C1 或 C2];

混合模式為:解釋模式和編譯模式搭配使用。

753e5d2a-2f1f-11ed-ba43-dac502259ad0.png

如圖,我的環(huán)境里JVM 運(yùn)行于 Server 模式,如果使用即時(shí)編譯,那么就是使用的:C2 即時(shí)編譯器。

2. 即時(shí)編譯器

了解如下的幾個(gè) 概念:

1. 解釋模式

它不使用即時(shí)編譯器進(jìn)行后端優(yōu)化

強(qiáng)制虛擬機(jī)運(yùn)行于 “解釋模式” -Xint

禁用后臺(tái)編譯 -XX:-BackgroundCompilation

2. 編譯模式

即時(shí)編譯器會(huì)在運(yùn)行時(shí),對(duì)生成的本地機(jī)器碼進(jìn)行優(yōu)化,其中重點(diǎn)關(guān)照熱點(diǎn)代碼。

#強(qiáng)制虛擬機(jī)運(yùn)行于"編譯模式"
-Xcomp
#方法調(diào)用次數(shù)計(jì)數(shù)器閾值,它是基于計(jì)數(shù)器熱點(diǎn)代碼探測(cè)依據(jù)[Client模式=1500,Server模式=10000]
-XX:CompileThreshold=10
#關(guān)閉方法調(diào)用次數(shù)熱度衰減,使用方法調(diào)用計(jì)數(shù)的絕對(duì)值,它搭配上一配置項(xiàng)使用
-XX:-UseCounterDecay
#除了熱點(diǎn)方法,還有熱點(diǎn)回邊代碼[循環(huán)],熱點(diǎn)回邊代碼的閾值計(jì)算參考如下:
-XX:BackEdgeThreshold=方法計(jì)數(shù)器閾值[-XX:CompileThreshold]*OSR比率[-XX:OnStackReplacePercentage]
#OSR比率默認(rèn)值:Client模式=933,Server模式=140
-XX:OnStackReplacePercentag=100

所謂 “即時(shí)”,它是在運(yùn)行過(guò)程中發(fā)生的,所以它的缺點(diǎn)也也明顯:在運(yùn)行期間需要耗費(fèi)資源去做性能分析,也不太適合在運(yùn)行期間去大刀闊斧的去做一些耗費(fèi)資源的重負(fù)載優(yōu)化操作。

3. 提前編譯器:jaotc

它是后端編譯的另一個(gè)主角,它有兩個(gè)發(fā)展路線,基于Graal [新時(shí)代的主角] 編譯器開(kāi)發(fā),因?yàn)楸疚挠玫氖?C2 編譯器,所以只對(duì)它做一個(gè)了解;

第一條路線 :與傳統(tǒng)的C、C++編譯做的事情類似,在程序運(yùn)行之前就把程序代碼編譯成機(jī)器碼;好處是夠快,不占用運(yùn)行時(shí)系統(tǒng)資源,缺點(diǎn)是"啟動(dòng)過(guò)程" 會(huì)很緩慢;

第二條路線 :已知即時(shí)編譯運(yùn)行時(shí)做性能統(tǒng)計(jì)分析占用資源,那么,我們可以把其中一些耗費(fèi)資源的編譯工作,放到提前編譯階段來(lái)完成啊,最后在運(yùn)行時(shí)即時(shí)編譯器再去使用,那么可以大大節(jié)省即時(shí)編譯的開(kāi)銷;這個(gè)分支可以把它看作是即時(shí)編譯緩存;

遺憾的是它只支持 G1 或者 Parallel 垃圾收集器,且只存在JDK 9 以后的版本,暫不需要去關(guān)注它;JDK 9 以后的版本可以使用這個(gè)參數(shù)打印相關(guān)信息:[-XX:PrintAOT]

三、關(guān)于測(cè)試的約束

執(zhí)行用時(shí)統(tǒng)計(jì)

System.naoTime() 輸出的是過(guò)了多少時(shí)間[微秒:10的負(fù)9次方秒],并不是完全精確的方法執(zhí)行用時(shí)的合計(jì),為了保證結(jié)果準(zhǔn)確性,測(cè)試的運(yùn)算次數(shù)將拉長(zhǎng)到百萬(wàn)甚至千萬(wàn)次。

編譯器優(yōu)化的因素

上一節(jié)花了一定的篇幅介紹編譯器優(yōu)化,這里我要做的是:對(duì)比完全不使用任何編譯優(yōu)化,與使用即時(shí)編譯時(shí),try catch 對(duì)的性能影響。

  • 通過(guò)指令禁用 JVM 的編譯優(yōu)化,讓它以最原始的狀態(tài)運(yùn)行,然后看有無(wú) try catch 的影響。
  • 通過(guò)指令使用即時(shí)編譯,盡量做到把后端優(yōu)化拉滿,看看 try catch 十有會(huì)影響到 jvm的編譯優(yōu)化。

關(guān)于指令重排序

目前尚未可知 try catch 的使用影響指令重排序;

我們這里的討論有一個(gè)前提,當(dāng) try catch 的使用無(wú)法避免時(shí),我們應(yīng)該如何使用 try catch 以應(yīng)對(duì)它可能存在的對(duì)指令重排序的影響。

  • 指令重排序發(fā)生在多線程并發(fā)場(chǎng)景,這么做是為了更好的利用CPU資源,在單線程測(cè)試時(shí)不需要考慮。不論如何指令重排序,都會(huì)保證最終執(zhí)行結(jié)果,與單線程下的執(zhí)行結(jié)果相同;
  • 雖然我們不去測(cè)試它,但是也可以進(jìn)行一些推斷,參考 volatile 關(guān)鍵字禁止指令重排序的做法:插入內(nèi)存屏障;
  • 假定 try catch 存在屏障,導(dǎo)致前后的代碼分割;那么最少的try catch代表最少的分割。
  • 所以,是不是會(huì)有這樣的結(jié)論呢:我們把方法體內(nèi)的 多個(gè) try catch 合并為一個(gè) try catch 是不是反而能減少屏障呢?這么做勢(shì)必造成 try catch 的范圍變大。

當(dāng)然,上述關(guān)于指令重排序討論內(nèi)容都是基于個(gè)人的猜想,猶未可知 try catch 是否影響指令重排序;本文重點(diǎn)討論的也只是單線程環(huán)境下的 try catch 使用影響性能。

四、測(cè)試代碼

循環(huán)次數(shù)為100W ,循環(huán)內(nèi)10次預(yù)算[給編譯器優(yōu)化預(yù)留優(yōu)化的可能,這些指令可能被合并]

每個(gè)方法都會(huì)到達(dá)千萬(wàn)次浮點(diǎn)計(jì)算。

同樣每個(gè)方法外層再循環(huán)跑多次,最后取其中的眾數(shù)更有說(shuō)服力。

publicclassExecuteTryCatch{

//100W
privatestaticfinalintTIMES=1000000;
privatestaticfinalfloatSTEP_NUM=1f;
privatestaticfinalfloatSTART_NUM=Float.MIN_VALUE;


publicstaticvoidmain(String[]args){
inttimes=50;
ExecuteTryCatchexecuteTryCatch=newExecuteTryCatch();
//每個(gè)方法執(zhí)行50次
while(--times>=0){
System.out.println("times=".concat(String.valueOf(times)));
executeTryCatch.executeMillionsEveryTryWithFinally();
executeTryCatch.executeMillionsEveryTry();
executeTryCatch.executeMillionsOneTry();
executeTryCatch.executeMillionsNoneTry();
executeTryCatch.executeMillionsTestReOrder();
}
}

/**
*千萬(wàn)次浮點(diǎn)運(yùn)算不使用trycatch
**/
publicvoidexecuteMillionsNoneTry(){
floatnum=START_NUM;
longstart=System.nanoTime();
for(inti=0;i1f;
num=num+STEP_NUM+2f;
num=num+STEP_NUM+3f;
num=num+STEP_NUM+4f;
num=num+STEP_NUM+5f;
num=num+STEP_NUM+1f;
num=num+STEP_NUM+2f;
num=num+STEP_NUM+3f;
num=num+STEP_NUM+4f;
num=num+STEP_NUM+5f;
}
longnao=System.nanoTime()-start;
longmillion=nao/1000000;
System.out.println("noneTrysum:"+num+"million:"+million+"nao:"+nao);
}

/**
*千萬(wàn)次浮點(diǎn)運(yùn)算最外層使用trycatch
**/
publicvoidexecuteMillionsOneTry(){
floatnum=START_NUM;
longstart=System.nanoTime();
try{
for(inti=0;i1f;
num=num+STEP_NUM+2f;
num=num+STEP_NUM+3f;
num=num+STEP_NUM+4f;
num=num+STEP_NUM+5f;
num=num+STEP_NUM+1f;
num=num+STEP_NUM+2f;
num=num+STEP_NUM+3f;
num=num+STEP_NUM+4f;
num=num+STEP_NUM+5f;
}
}catch(Exceptione){

}
longnao=System.nanoTime()-start;
longmillion=nao/1000000;
System.out.println("oneTrysum:"+num+"million:"+million+"nao:"+nao);
}

/**
*千萬(wàn)次浮點(diǎn)運(yùn)算循環(huán)內(nèi)使用trycatch
**/
publicvoidexecuteMillionsEveryTry(){
floatnum=START_NUM;
longstart=System.nanoTime();
for(inti=0;itry{
num=num+STEP_NUM+1f;
num=num+STEP_NUM+2f;
num=num+STEP_NUM+3f;
num=num+STEP_NUM+4f;
num=num+STEP_NUM+5f;
num=num+STEP_NUM+1f;
num=num+STEP_NUM+2f;
num=num+STEP_NUM+3f;
num=num+STEP_NUM+4f;
num=num+STEP_NUM+5f;
}catch(Exceptione){

}
}
longnao=System.nanoTime()-start;
longmillion=nao/1000000;
System.out.println("evertTrysum:"+num+"million:"+million+"nao:"+nao);
}


/**
*千萬(wàn)次浮點(diǎn)運(yùn)算循環(huán)內(nèi)使用trycatch,并使用finally
**/
publicvoidexecuteMillionsEveryTryWithFinally(){
floatnum=START_NUM;
longstart=System.nanoTime();
for(inti=0;itry{
num=num+STEP_NUM+1f;
num=num+STEP_NUM+2f;
num=num+STEP_NUM+3f;
num=num+STEP_NUM+4f;
num=num+STEP_NUM+5f;
}catch(Exceptione){

}finally{
num=num+STEP_NUM+1f;
num=num+STEP_NUM+2f;
num=num+STEP_NUM+3f;
num=num+STEP_NUM+4f;
num=num+STEP_NUM+5f;
}
}
longnao=System.nanoTime()-start;
longmillion=nao/1000000;
System.out.println("finalTrysum:"+num+"million:"+million+"nao:"+nao);
}

/**
*千萬(wàn)次浮點(diǎn)運(yùn)算,循環(huán)內(nèi)使用多個(gè)trycatch
**/
publicvoidexecuteMillionsTestReOrder(){
floatnum=START_NUM;
longstart=System.nanoTime();
for(inti=0;itry{
num=num+STEP_NUM+1f;
num=num+STEP_NUM+2f;
}catch(Exceptione){}

try{
num=num+STEP_NUM+3f;
num=num+STEP_NUM+4f;
num=num+STEP_NUM+5f;
}catch(Exceptione){}

try{
num=num+STEP_NUM+1f;
num=num+STEP_NUM+2f;
}catch(Exceptione){}
try{

num=num+STEP_NUM+3f;
num=num+STEP_NUM+4f;
num=num+STEP_NUM+5f;
}catch(Exceptione){}
}
longnao=System.nanoTime()-start;
longmillion=nao/1000000;
System.out.println("orderTrysum:"+num+"million:"+million+"nao:"+nao);
}

}

五、解釋模式下執(zhí)行測(cè)試

設(shè)置如下JVM參數(shù),禁用編譯優(yōu)化

-Xint
-XX:-BackgroundCompilation

754d832c-2f1f-11ed-ba43-dac502259ad0.png結(jié)合測(cè)試代碼發(fā)現(xiàn),即使百萬(wàn)次循環(huán)計(jì)算,每個(gè)循環(huán)內(nèi)都使用了 try catch 也并沒(méi)用對(duì)造成很大的影響。

唯一發(fā)現(xiàn)了一個(gè)問(wèn)題,每個(gè)循環(huán)內(nèi)都是使用 try catch 且使用多次。發(fā)現(xiàn)性能下降,千萬(wàn)次計(jì)算差值為:5~7 毫秒;4個(gè) try 那么執(zhí)行的指令最少4條goto ,前邊闡述過(guò),這里造成這個(gè)差異的主要原因是 goto 指令占比過(guò)大,放大了問(wèn)題;當(dāng)我們?cè)趲装傩写a里使用少量try catch 時(shí),goto所占比重就會(huì)很低,測(cè)試結(jié)果會(huì)更趨于合理。

六、編譯模式測(cè)試

設(shè)置如下測(cè)試參數(shù),執(zhí)行10 次即為熱點(diǎn)代碼

-Xcomp
-XX:CompileThreshold=10
-XX:-UseCounterDecay
-XX:OnStackReplacePercentage=100
-XX:InterpreterProfilePercentage=33

執(zhí)行結(jié)果如下圖,難分勝負(fù),波動(dòng)只在微秒級(jí)別,執(zhí)行速度也快了很多,編譯效果拔群啊,甚至連 “解釋模式” 運(yùn)行時(shí)多個(gè)try catch 導(dǎo)致的,多個(gè)goto跳轉(zhuǎn)帶來(lái)的問(wèn)題都給順帶優(yōu)化了;由此也可以得到 try catch 并不會(huì)影響即時(shí)編譯的結(jié)論。

75940c02-2f1f-11ed-ba43-dac502259ad0.png

我們可以再上升到億級(jí)計(jì)算,依舊難分勝負(fù),波動(dòng)在毫秒級(jí)。

75ba48a4-2f1f-11ed-ba43-dac502259ad0.png

七、結(jié)論

try catch 不會(huì)造成巨大的性能影響,換句話說(shuō),我們平時(shí)寫代碼最優(yōu)先考慮的是程序的健壯性,當(dāng)然大佬們肯定都知道了怎么合理使用try catch了,但是對(duì)萌新來(lái)說(shuō),你如果不確定,那么你可以使用 try catch;

在未發(fā)生異常時(shí),給代碼外部包上 try catch,并不會(huì)造成影響。

舉個(gè)栗子吧,我的代碼中使用了:URLDecoder.decode,所以必須得捕獲異常。

privateintgetThenAddNoJudge(JSONObjectjson,Stringkey){
if(Objects.isNull(json))
thrownewIllegalArgumentException("參數(shù)異常");
intnum;
try{
//不校驗(yàn)key是否未空值,直接調(diào)用toString每次觸發(fā)空指針異常并被捕獲
num=100+Integer.parseInt(URLDecoder.decode(json.get(key).toString(),"UTF-8"));
}catch(Exceptione){
num=100;
}
returnnum;
}

privateintgetThenAddWithJudge(JSONObjectjson,Stringkey){
if(Objects.isNull(json))
thrownewIllegalArgumentException("參數(shù)異常");
intnum;
try{
//校驗(yàn)key是否未空值
num=100+Integer.parseInt(URLDecoder.decode(Objects.toString(json.get(key),"0"),"UTF-8"));
}catch(Exceptione){
num=100;
}
returnnum;
}

publicstaticvoidmain(String[]args){
inttimes=1000000;//百萬(wàn)次

longnao1=System.nanoTime();
ExecuteTryCatchexecuteTryCatch=newExecuteTryCatch();
for(inti=0;inewJSONObject(),"anyKey");
}
longend1=System.nanoTime();
System.out.println("未拋出異常耗時(shí):millions="+(end1-nao1)/1000000+"毫秒nao="+(end1-nao1)+"微秒");


longnao2=System.nanoTime();
for(inti=0;inewJSONObject(),"anyKey");
}
longend2=System.nanoTime();
System.out.println("每次必拋出異常:millions="+(end2-nao2)/1000000+"毫秒nao="+(end2-nao2)+"微秒");
}

調(diào)用方法百萬(wàn)次,執(zhí)行結(jié)果如下:

75d052ac-2f1f-11ed-ba43-dac502259ad0.png

經(jīng)過(guò)這個(gè)例子,我想你知道你該如何 編寫你的代碼了吧?可怕的不是 try catch 而是 搬磚業(yè)務(wù)不熟練啊。

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    2989

    瀏覽量

    109493
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1661

    瀏覽量

    50193
  • JVM
    JVM
    +關(guān)注

    關(guān)注

    0

    文章

    160

    瀏覽量

    12613

原文標(biāo)題:別被騙了,try-catch語(yǔ)句真的會(huì)影響性能嗎?

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    STM32CUBEMX界面重影嚴(yán)重怎么解決?

    STM32CUBEMX 界面重影嚴(yán)重,有相同問(wèn)題的嗎
    發(fā)表于 03-14 07:13

    Java中的常用異常處理方法 java推薦

    IllegalArgumentException 類,IllegalStateException 類。捕獲異常的方法使用 trycatch 關(guān)鍵字可以捕獲異常,try/catch
    發(fā)表于 01-19 17:26

    Java捕獲異常處理的常用方法

    IllegalArgumentException 類,IllegalStateException 類。捕獲異常的方法使用 trycatch 關(guān)鍵字可以捕獲異常,try/catch
    發(fā)表于 11-27 11:40

    如果IT設(shè)備壞了,嚴(yán)重影響日常的運(yùn)作怎么辦?

    如果IT設(shè)備壞了,嚴(yán)重影響日常的運(yùn)作怎么辦?
    發(fā)表于 12-07 15:12

    Sqlserver Try Catch時(shí)Catch捕獲到錯(cuò)誤重試一次的方法分享

    CATCH…END CATCH是一體的,如果他們兩者放入IF后面,不會(huì)因?yàn)閮蓚€(gè)BEGIN就會(huì)導(dǎo)致BEGIN CATCH…END CATCH不受IF管控2、這種
    發(fā)表于 11-10 17:44

    cubemx顯示嚴(yán)重重影是為什么?

    cubemx顯示嚴(yán)重重影,調(diào)整分辨率恢復(fù)一段時(shí)間后又出現(xiàn)重影
    發(fā)表于 08-04 11:27

    Java異常處理之try,catch,finally,throw,throws

    ,程序繼續(xù)運(yùn)行。 java的異常處理是通過(guò)5個(gè)關(guān)鍵字來(lái)實(shí)現(xiàn)的:try、catch、finally、throw、throws。 二:java異常類的層次結(jié)構(gòu) 三。常見(jiàn)的異常類型 Exce
    發(fā)表于 09-27 11:17 ?0次下載
    <b class='flag-5'>Java</b>異常處理之<b class='flag-5'>try</b>,<b class='flag-5'>catch</b>,finally,throw,throws

    俄軍嘗試對(duì)敘利亞上空的美無(wú)人機(jī)實(shí)施干擾,“嚴(yán)重影響”美無(wú)人機(jī)行動(dòng)

    據(jù)美國(guó)報(bào)道稱,俄軍正在積極嘗試對(duì)敘利亞上空的美軍無(wú)人機(jī)實(shí)施干擾,通過(guò)干擾全球衛(wèi)星定位系統(tǒng)信號(hào)的發(fā)射破壞飛行行動(dòng)。干擾行動(dòng)“嚴(yán)重影響”美無(wú)人機(jī)行動(dòng),但尚不清楚到底有多嚴(yán)重。
    發(fā)表于 07-22 11:58 ?735次閱讀

    Java并行流存在的問(wèn)題及解決辦法詳解

    對(duì)于從事Java開(kāi)發(fā)的童鞋來(lái)說(shuō),相信對(duì)于Java8的并行流并不陌生,沒(méi)錯(cuò),我們常常用它來(lái)執(zhí)行并行任務(wù),但是由于并行流(parallel stream)采用的是享線程池,可能會(huì)對(duì)我們的性能造成嚴(yán)
    發(fā)表于 04-03 15:55 ?12次下載

    TDD模式下Rx對(duì)Tx的嚴(yán)重影響怎么解決

    很難想象TDD模式下Rx對(duì)Tx造成了嚴(yán)重影響,若不是親眼所見(jiàn),我也是完全不相信的,按道理說(shuō)這種事情只能發(fā)生在FDD模式下。近期在為朋友解決一款5.8GHz大功率無(wú)線網(wǎng)橋的射頻問(wèn)題時(shí),發(fā)現(xiàn)Chain0
    的頭像 發(fā)表于 09-14 17:39 ?5629次閱讀
    TDD模式下Rx對(duì)Tx的<b class='flag-5'>嚴(yán)重影響</b>怎么解決

    案例IKTV裝修要注意,信號(hào)覆蓋做不好嚴(yán)重影響生意!

    繁華都市中,也有信號(hào)覆蓋不到的地方 地下商城、KTV、酒吧等 經(jīng)常被客人投訴“信號(hào)差”? 無(wú)法支持手機(jī)支付? 嚴(yán)重影響店鋪生意!前期就要做好信號(hào)覆蓋! ? 今天給大家分享一個(gè) 湖南邵陽(yáng)——KTV覆蓋
    的頭像 發(fā)表于 11-12 13:37 ?1331次閱讀
    案例IKTV裝修要注意,信號(hào)覆蓋做不好<b class='flag-5'>嚴(yán)重影響</b>生意!

    公司這套架構(gòu)統(tǒng)一處理try...catch真香!

    軟件開(kāi)發(fā)springboot項(xiàng)目過(guò)程中,不可避免的需要處理各種異常,spring mvc 架構(gòu)中各層會(huì)出現(xiàn)大量的try {...} catch {...} finally {...} 代碼塊,不僅
    的頭像 發(fā)表于 02-27 10:47 ?668次閱讀

    使用try-catch捕獲異常會(huì)影響性能嗎?

    “BB 不如 show code,看到?jīng)], 老王,我把 try-catch 從 for 循環(huán)里面提出來(lái)跟在for循環(huán)里面做個(gè)對(duì)比跑一下,你猜猜兩個(gè)差多少?”
    的頭像 發(fā)表于 04-01 11:08 ?1510次閱讀

    try catch應(yīng)該在for循環(huán)里面還是外面?

    因?yàn)楸旧?b class='flag-5'>try catch 放在 for循環(huán) 外面 和里面 ,如果出現(xiàn)異常,產(chǎn)生的效果是不一樣的。
    的頭像 發(fā)表于 07-31 10:16 ?1159次閱讀
    <b class='flag-5'>try</b> <b class='flag-5'>catch</b>應(yīng)該在for循環(huán)里面還是外面?

    為何高溫會(huì)嚴(yán)重影響鋰離子電池的安全性?

    為何高溫會(huì)嚴(yán)重影響鋰離子電池的安全性? 高溫對(duì)鋰離子電池的安全性有嚴(yán)重影響。鋰離子電池在過(guò)高的溫度下會(huì)發(fā)生一系列的熱化學(xué)反應(yīng),可能導(dǎo)致電解液的分解、電極的氧化、電池內(nèi)部結(jié)構(gòu)的破壞以及更嚴(yán)重
    的頭像 發(fā)表于 12-08 16:05 ?3361次閱讀