far語(yǔ)言方法返回值處理的設(shè)計(jì)
far的所有方法,靜態(tài)和動(dòng)態(tài)方法,包括調(diào)用原生java的方法,在far編譯器生成字節(jié)碼的時(shí)候,會(huì)判斷這個(gè)方法是否處于取值狀態(tài),如果不是,棧頂?shù)姆祷刂稻蜁?huì)被POP掉

什么是方法的取值狀態(tài)
//賦值
var x = test();
//作為另一個(gè)方法的返回值
call(test());
上面的test方法處于取值表達(dá)式,所以棧頂?shù)姆祷刂担粫?huì)被POP,但如果是這樣
test();
上面的調(diào)用,test的棧頂?shù)姆祷刂担隙〞?huì)被POP掉
問(wèn)題來(lái)了
try{
test();
test2();
test1();
}catch(e){
println(e);
}
上面是很正常的業(yè)務(wù)代碼,如果test2()有異常,異常的對(duì)象信息會(huì)被JVM存到棧頂,按照f(shuō)ar編譯器現(xiàn)在的處理,肯定會(huì)POP掉棧頂?shù)漠惓?duì)象,直接就導(dǎo)致println這一行報(bào)錯(cuò)。
如何在不改變目前編譯器邏輯的情況下,完成異常捕獲這個(gè)任務(wù)?如果是你,你想如何捕獲異常?
目前想到的方案
在
target.currMethodMv().visitInsn(POP);前面檢查棧頂?shù)闹凳遣皇钱惓?duì)象類(lèi)型,如果是就不POP
Rust編程語(yǔ)言群 1036955113
java新手自學(xué)群 626070845
java/springboot/hadoop/JVM 群 4915800
Hadoop/mongodb(搭建/開(kāi)發(fā)/運(yùn)維)Q群481975850
GOLang Q1群:6848027
GOLang Q2群:450509103
GOLang Q3群:436173132
GOLang Q4群:141984758
GOLang Q5群:215535604
C/C++/QT群 1414577
單片機(jī)嵌入式/電子電路入門(mén)群群 306312845
MUD/LIB/交流群 391486684
Electron/koa/Nodejs/express 214737701
大前端群vue/js/ts 165150391
操作系統(tǒng)研發(fā)群:15375777
匯編/輔助/破解新手群:755783453
大數(shù)據(jù) elasticsearch 群 481975850
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。
java新手自學(xué)群 626070845
java/springboot/hadoop/JVM 群 4915800
Hadoop/mongodb(搭建/開(kāi)發(fā)/運(yùn)維)Q群481975850
GOLang Q1群:6848027
GOLang Q2群:450509103
GOLang Q3群:436173132
GOLang Q4群:141984758
GOLang Q5群:215535604
C/C++/QT群 1414577
單片機(jī)嵌入式/電子電路入門(mén)群群 306312845
MUD/LIB/交流群 391486684
Electron/koa/Nodejs/express 214737701
大前端群vue/js/ts 165150391
操作系統(tǒng)研發(fā)群:15375777
匯編/輔助/破解新手群:755783453
大數(shù)據(jù) elasticsearch 群 481975850
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。

浙公網(wǎng)安備 33010602011771號(hào)