[code="java"]
private String queryOrgDn(String parentid,String dn){
System.out.println("parentid : " +parentid);
int len = parentid.trim().length();
while(len > 5) {
AndFilter filter = new AndFilter();
filter.and(new EqualsFilter("objectclass","uumOrg"));
filter.and(new EqualsFilter("ESSPorgId",parentid));
List alist = ldapTemplate_user.search("", filter.encode(),new OrgAttributeMapper());
System.out.println("alist : " + alist.size());
if(null!=alist&&0<alist.size()){
Org _aorg = alist.get(0);
String _parentid = _aorg.getESSPparentId();
String _dn = dn + _aorg.getOu();
queryOrgDn(_parentid,_dn);//@2
}else break;
}
return dn;//@1
}
[/code]
我打断点调试过了,在运行到@1处后,程序又会回到@2处,然后@1,@2,@1,@2....陷入死循环。不是很懂递归调用,请指教!谢谢
感觉 while(len > 5)改成if(len > 5)
@2 处 应该是 return queryOrgDn(_parentid,_dn);//@2
在实际项目中基本上很少用到递归,因为递归这种算法相当耗资源。至于你提到的问题,请debug参数_parentid,看看这个参数是不是每次运行到@2处都是变化的,并且满足_parentid.trim().length()> 5这个条件的,如果每次都满足这个条件请跟踪alist,看这个参数是否变化,是否满足条件null!=alist&&0<alist.size()。如果以上两点都满足说明进入死循环。简单一句话说就是,程序运行到@2后,递归调用自身方法,当再进入@2时再递归...所以下面的break和return形同虚设了。请在递归传参时多加考虑
补充一下,因为运行到@1后,只是完成了最外层的方法体,还有很多递归造成的内存方法体未完成,也就是说有方法没有运行到@1这一步所以会出现这种死循环。
@1完了回去执行@2,请注意这里可能参数已经变成第一次执行@2时的值了,就这样@2又回到@1,然后@1完了又回去执行@2...可以debug看看是不是我说的这样。
如果第一次传入的len满足len>5,同时(null!=alist&&0 所以最里层的len>5和(null!=alist&&0<alist.size())不同时为true的流程在一直被调用,出现lz说的a1和a2不停交替的情况。
int len = parentid.trim().length();
while(len > 5) { ..... }
以上条件满足,并且下面的alist大于0的话就会陷入死循环,因为每次循环你都会重新new AndFilter(),在将and方法重新计算一遍。
AndFilter filter = new AndFilter();
filter.and(new EqualsFilter("objectclass","uumOrg"));
filter.and(new EqualsFilter("ESSPorgId",parentid));
如果我没有理解或猜错的话,以下search方法始终会与上一次循环的计算结果相同。
List alist = ldapTemplate_user.search("", filter.encode(),new OrgAttributeMapper());
当alist每次都是相同的结果,并且大于0,此处会进入递归中,递归里面又重复执行上面说描述的满足条件计算,则会陷入无止的循环中,直到挂掉。
if(null!=alist&&0<alist.size()){
......
queryOrgDn(_parentid,_dn);//@2 进入递归
}else break; //if条件满足的话,不会进入到break
你的方法传入的dn,在if 当中dn只是做为局部变量去和其它返回值组合,而dn本身的值没有发生变化,你的queryOrgDn()方法每次返回的值都会是你传入到参数dn,如果是计算数值的方法,你这个递归没什么意义
private String queryOrgDn(String parentid,String dn){
......
String _dn = dn + _aorg.getOu();
......
return dn;//@1
}
使用递归最重要的是要清楚退出的条件是什么,你的程序的退出条件为parentid<=5的时候,就会跳出此递归。所以你parentid的长度才是关键