今天解决的一个问题, 本来以为是 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) |