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;
    }

这样才会得到想要的结果。

 

特此警示:递归调用关于返回值的陷阱

转载于:https://www.cnblogs.com/sqtds/archive/2012/12/20/2826156.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值