- 论坛徽章:
- 0
|
今天解决的一个问题, 本来以为是 TOMCAT 的问题, 后来证明是我自己学习不深入.
我的程序没执行完,不知什么缘故就被 TOMCAT 管理线程回收了.在一些特定条件下问题重现率100%.
一开始认为是 TOMCAT 的问题,后来经过一步步地调试,终于调出来了我程序的一个BUG.下面晒一下我的代码:
下面是有错误的代码:
public String makeResultItemOutput(String output)
{
Pattern fixp = Pattern.compile("\\[FIX:(\\d+)\\]");
if (output == null)
return null;
String str = output;
Matcher m = fixp.matcher(str);
while (m.find())
{
String num = m.group(1);
num = " + num
+ "');\">点此查看";
str = m.replaceFirst(num);
}
return str;
}
原意是想把一个字符串中符合正规条件的子串全换成一个链接, 链接地址是根据这个字串中的一个字段来决定的. 程序的执行结果可能有些经验的人会知道, 因为 matcher 中的字符始终没变,都是 str. 所以每次都能找到. 然后每次都替换, 最后的结果可想而知了, 死循环. TOMCAT 查觉到了, 所以就在后台报错. 实际也没杀掉, 只是因为死循环, CPU 占 100%, 没响应, 以为是被 KILL 了.
我也有一点比较奇怪: 当这个字符串只能匹配一次正则时, 程序运行没有问题. 但有两个以上时会死循环.
下面贴上正确代码:
public String makeResultItemOutput(String output)
{
Pattern fixp = Pattern.compile("\\[FIX:(\\d+)\\]");
if (output == null)
return null;
String str = output;
while (true)
{
Matcher m = fixp.matcher(str);
if (m.find())
{
String num = m.group(1);
// System.out.println(num);
num = "doOpen('/diagnose/getFixNumberContent.do?fixNumber=" + num
+ "');\">点此查看";
str = m.replaceFirst(num);
// System.out.println(str);
}
else
return str;
}
}
把 fixp.matcher() 放到循环里了, 然后每次都会重新 match 一下新生成的字符串.
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/10921/showart_514483.html |
|