上个星期修改了短信网关的重启程序,结果这周又遇到了新问题。虽然有时可以重启成功,但是有时候还是重启失败。本地模拟测试怎么都没发现这个问题,趁着闲时的功夫,自己到正式环境将日志分析了一下,发现重启不成功的原因主要在心跳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;
}
这样才会得到想要的结果。
特此警示:嵌套方法调用关于返回值的陷阱