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