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