Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1938717
  • 博文数量: 219
  • 博客积分: 8963
  • 博客等级: 中将
  • 技术积分: 2125
  • 用 户 组: 普通用户
  • 注册时间: 2005-10-19 12:48
个人简介

文章分类

全部博文(219)

文章存档

2021年(1)

2020年(3)

2015年(4)

2014年(5)

2012年(7)

2011年(37)

2010年(40)

2009年(22)

2008年(17)

2007年(48)

2006年(31)

2005年(4)

分类: Java

2008-04-02 01:19:40

今天解决的一个问题, 本来以为是 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 一下新生成的字符串.

阅读(1948) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~