java方法遞歸調用的陷阱


      上個星期修改了短信網關的重啟程序,結果這周又遇到了新問題。雖然有時可以重啟成功,但是有時候還是重啟失敗。本地模擬測試怎么都沒發現這個問題,趁着閑時的功夫,自己到正式環境將日志分析了一下,發現重啟不成功的原因主要在心跳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;
    }

這樣才會得到想要的結果。

 

特此警示:遞歸調用關於返回值的陷阱


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM