Server 2008 r2环境中的Java StringIndexOutOfBoundsexception

这里是一个非常简单的代码块使用JRE 1.6运行时环境,并运行在64位服务器Server 2008 R2:….

cntr = 0; while (cntr < localheaders.size()) { String tempText = textstring.toUpperCase(); int pos = 0; int lastindx = 0; int lendPos; int tendPos = 0; while ((pos > -1) && (tempText.length() > 0)) { int headerLengthbeforeUpper = localheaders.get(cntr).header.length(); String aHeader = localheaders.get(cntr).header.toUpperCase(); int headerLengthafterUpper = aHeader.length(); pos = tempText.indexOf(aHeader); // 10_21_2010 if (pos > 0) { // ef 07-10-2011 char c; try { c = tempText.charAt(pos - 1); if (Character.isLetterOrDigit(c)) pos = -1; } catch (Exception e) { System.out.println("Value of pos->" + pos); System.out.println("Length of the string->" + tempText.length()); System.out.println("header length before->"+headerLengthbeforeUpper); System.out.println("header length after->"+headerLengthafterUpper); e.printStackTrace(); } } ........ 

我发现的是pos = tempText.toUpperCase().indexOf(aHeader); (大约10行)被间歇性地设置为大于string长度的stringtempText中的值。 这会导致java.lang.StringIndexOutOfBoundsException 。 索引始终在string实际长度的100以内。 例如,在我今天晚上跑的一个testing中,posvariable被设置为24432,长度为24404。在大写之前和之后的头部长度是相同的,以解决下面的一个注释。 注意,如果我连续两次在同一个文件上重新运行代码,第二次错误不会发生。

一些额外的信息:

  1. 我不相信它是一个线程问题,因为只有一个线程正在使用。
  2. 代码在32位XP环境下运行良好。
  3. pos和tempText都是本地定义的variables。
  4. 当我键入java -version时,我看到以下内容:

Java版本“1.6.0_20”Jav(TM)SE运行环境(版本1.6.0_20-b02)Java HotSpot(TM)64位服务器VM(版本16.3-b01,混合模式)

testing环境在VMware Workstation中运行。

我相信这是一个环境问题,给出了错误的奇怪和它只在我的64位testing环境中显示的事实。 我试图找出问题的根源。 有没有人,过去有过这样的错误? 有没有人知道有关这个特定的Java构build可能会导致这种错误的错误?

任何想法如何解决这个问题?

谢谢,

埃利奥特

看起来像这个错误可能与您的问题有关:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6942326