上個(gè)星期修改了短信網(wǎng)關(guān)的重啟程序,結(jié)果這周又遇到了新問(wèn)題。雖然有時(shí)可以重啟成功,但是有時(shí)候還是重啟失敗。本地模擬測(cè)試怎么都沒(méi)發(fā)現(xiàn)這個(gè)問(wèn)題,趁著閑時(shí)的功夫,自己到正式環(huán)境將日志分析了一下,發(fā)現(xiàn)重啟不成功的原因主要在心跳3次后沒(méi)有收到響應(yīng)消息,程序不會(huì)自動(dòng)重啟,而是不斷的繼續(xù)發(fā)送心跳。
看了看代碼,沒(méi)有發(fā)現(xiàn)哪里有錯(cuò)啊。想了想,難道是由于方法嵌套調(diào)用的原因?于是自己弄了個(gè)簡(jiǎn)單的測(cè)試,來(lái)驗(yàn)證:
public static boolean tests(int i){
if(i>5){
return false;
}
if(true){
tests(++i);
}
return true;
}
好小子,果然是這里的問(wèn)題,原來(lái)是由于tests()方法調(diào)用了tests()方法后,每個(gè)test()方法都有自己的返回值,只有第一層的tests()方法才會(huì)把自己的返回值輸出給調(diào)用他的程序。
例如:若有程序調(diào)用了tests(1)后,tests(2)將返回值返回給了tests(1),tests(3)將返回值返回給了test(2),以此類推。運(yùn)行完tests(5)后,tests(1)還會(huì)向下執(zhí)行,最后結(jié)果不論如何都是true.
所以要想這里的結(jié)果正確,設(shè)置一個(gè)標(biāo)志位接收每個(gè)tests()方法返回的值即可。
public static boolean tests(int i){
boolean flag = false;
if(i>5){
return false;
}
if(true){
flag = tests(++i);
}
return flag;
}
這樣才會(huì)得到想要的結(jié)果。
特此警示:嵌套方法調(diào)用關(guān)于返回值的陷阱