3 回答

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊
try
幾乎沒(méi)有任何費(fèi)用。try
代碼的元數(shù)據(jù)不是在運(yùn)行時(shí)進(jìn)行設(shè)置,而是在編譯時(shí)進(jìn)行結(jié)構(gòu)化,這樣當(dāng)拋出異常時(shí),它現(xiàn)在會(huì)執(zhí)行相對(duì)昂貴的操作,即向上移動(dòng)堆棧并查看是否try
存在任何可以捕獲此異常的塊例外。從外行的角度來(lái)看,try
也許是免費(fèi)的。它實(shí)際上拋出了讓你付出代價(jià)的例外 - 但除非你拋出數(shù)百或數(shù)千例外,否則你仍然不會(huì)注意到成本。
try
有一些與之相關(guān)的小成本。Java不能對(duì)try
塊中的代碼進(jìn)行一些優(yōu)化,否則它會(huì)執(zhí)行。例如,Java通常會(huì)在方法中重新排列指令以使其運(yùn)行得更快 - 但Java還需要保證如果拋出異常,就會(huì)觀(guān)察到方法的執(zhí)行,就好像它的語(yǔ)句一樣,在源代碼中執(zhí)行,執(zhí)行按順序排隊(duì)。
因?yàn)樵谝粋€(gè)try
塊中可以?huà)伋霎惓#ㄔ趖ry塊的任何一行!異步拋出一些異常,例如通過(guò)調(diào)用stop
一個(gè)Thread(不推薦使用),甚至OutOfMemoryError幾乎可以在任何地方發(fā)生)然而它可以捕獲并且代碼在之后以相同的方法繼續(xù)執(zhí)行,更難以推斷可以進(jìn)行的優(yōu)化,因此它們不太可能發(fā)生。(有人必須對(duì)編譯器進(jìn)行編程才能完成它們,推理并保證正確性等等。對(duì)于那些意味著'特殊'的事情來(lái)說(shuō),這將是一件巨大的痛苦。)但是,實(shí)際上你不會(huì)注意到這樣的事情。

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超13個(gè)贊
try
/ catch
可能會(huì)對(duì)性能產(chǎn)生一些影響。這是因?yàn)樗柚笿VM進(jìn)行一些優(yōu)化。Joshua Bloch在“Effective Java”中說(shuō)過(guò)以下內(nèi)容:
?將代碼放在try-catch塊中會(huì)禁止現(xiàn)有JVM實(shí)現(xiàn)可能執(zhí)行的某些優(yōu)化。
添加回答
舉報(bào)