Server 2008 r2环境中的Java StringIndexOutOfBounds异常

Server 2008 r2环境中的Java StringIndexOutOfBounds异常,java,windows,string,32bit-64bit,Java,Windows,String,32bit 64bit,下面是使用jre 1.6运行时环境并在64位server 2008 R2中运行的一段非常简单的代码: .... cntr = 0; while (cntr < localheaders.size()) { String tempText = textstring.toUpperCase(); int pos = 0; int lastindx = 0; int

下面是使用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();
                }

            }
........
cntr=0;
而(cntr-1)和&(testext.length()>0)){
int headerLengthbeforeUpper=localheaders.get(cntr.header.length();
字符串aHeader=localheaders.get(cntr.header.toUpperCase();
int headerLengthafterUpper=aHeader.length();
pos=文本索引(A标题);
// 10_21_2010
如果(位置>0){//ef 07-10-2011
字符c;
试一试{
c=外部字符(位置-1);
if(字符Isleterordigit(c))
pos=-1;
}捕获(例外e){
系统输出打印项次(“pos值->”+pos);
System.out.println(“字符串的长度->”
+testext.length());
System.out.println(“->”之前的标题长度+上方之前的标题长度);
System.out.println(“->”之后的标题长度+标题长度之后);
e、 printStackTrace();
}
}
........
我发现的是语句
pos=tentext.toUpperCase().indexOf(aHeader);
(大约向下10行) 正在间歇性地将设置为字符串
tentext
中大于字符串长度的值。这会导致
java.lang.StringIndexOutOfBoundsException
。索引始终在字符串实际长度的100范围内。例如,在我今晚运行的一个测试中,设置了
pos
变量对于长度为24404的字符串,改为24432。标题长度在大写前后相同,以解决以下注释之一。注意,如果我在同一文件上连续两次重新运行代码,则不会发生第二次错误

一些补充资料:

  • 我不相信这是线程问题,因为只有一个线程被使用
  • 该代码在32位XP环境中运行良好
  • pos和TENTEXT都是本地定义的变量
  • 当我键入java-version时,我会看到以下内容:
  • Java版本“1.6.0_20” Jav(TM)SE运行时环境(build 1.6.0_20-b02) Java HotSpot(TM)64位服务器虚拟机(构建16.3-b01,混合模式)

    测试环境正在VMware工作站中运行

    我相信这是一个环境问题,给出错误的奇怪之处,以及它只出现在我的64位测试环境中的事实。我正在试图找出问题的根源。有没有人,过去有过这种错误?有没有人知道与这种特定java构建相关的错误可能会导致这种错误?

    有没有办法解决这个问题

    谢谢,


    Elliott看起来这个bug可能与您的问题有关:


    什么是
    localheaders
    :字段,本地变量,它的类型是什么?为什么要调用
    toUpperCase()
    多次?除此之外,这意味着您没有打印您在上使用的
    indexOf
    的字符串长度。我无法立即看出这会是一个问题,但最好至少验证一下这不是问题所在。(您甚至可以进行诊断检查,以确保上壳体前后的尺寸相同。)localheaders是一个称为Headers的数据结构向量。header类的header字段只是一个字符串。该向量是在方法的前面定义和填充的。我不确定pos看起来可疑的原因。它只是一个简单的int。我看不到字符串
    aHeader
    /
    localheaders…header
    之间有任何联系e> 尝试查找
    aHeader
    的试探文本。当然,这并不容易解释索引大于
    aHeader
    的大小,除非第3行中的
    textstring
    实际上是
    localheaders…header
    ?只是为了澄清一下,代码块正在尝试查找试探文本中aHeader的位置。什么第10行中的indexOf产生的pos值大于TELTEXT的长度。这是怎么回事?这确实是一个java错误。尽管上面链接中引用的错误从未被验证过,但它准确地描述了我在安装最新64位版本(build 1.6.0_34-b04)时遇到的情况程序顺利完成,谢谢你,艾略特