【问题标题】:Java StringIndexOutOfBounds Exception in Server 2008 r2 environmentServer 2008 r2 环境中的 Java StringIndexOutOfBounds 异常
【发布时间】:2012-10-06 04:03:07
【问题描述】:

这是一段非常简单的代码,它使用 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 行以下) 被间歇性地设置为字符串tempText 中大于字符串长度的值。这导致java.lang.StringIndexOutOfBoundsException。索引始终在字符串实际长度的 100 以内。例如,在我今晚运行的测试中,pos 变量设置为 24432,字符串长度为 24404。标题长度在大写之前和之后相同,以解决下面的 cmets 之一。请注意,如果我连续两次在同一文件上重新运行代码,则第二次不会发生错误。

一些附加信息:

  1. 我不认为这是线程问题,因为只使用了一个线程。
  2. 代码在 32 位 XP 环境中运行良好。
  3. pos 和 tempText 都是本地定义的变量。
  4. 当我输入 java -version 时,我看到以下内容:

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

测试环境在 VMware Workstation 中运行。

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

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

谢谢,

艾略特

【问题讨论】:

  • 什么是localheaders:字段,本地变量,它是什么类型?
  • 你为什么要多次调用toUpperCase()?除此之外,这意味着您没有打印您在indexOf 上使用过的字符串的长度。我不能立即明白为什么这会是一个问题,但至少验证它不是问题会很好。 (您甚至可以诊断检查大小写前后大小是否相同。)
  • localheaders 是一个称为 Headers 的数据结构向量。 Header 类的头部字段只是一个字符串。 Vector 在该方法的前面定义和填充。我不确定为什么 pos 看起来很可疑。它只是一个简单的 int。
  • 我发现字符串aHeader/localheaders...headertempText 之间没有联系,您尝试在其中找到aHeader。这当然不能轻易解释索引大于aHeader的大小,除非第3行中的textstring真的是localheaders...header
  • 澄清一下,这段代码试图在 tempText 中找到 aHeader 的位置。发生的事情是第 10 行中的 indexOf 产生的 pos 值大于 tempText 的长度。怎么会这样?

标签: java windows string 32bit-64bit


【解决方案1】:

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

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

【讨论】:

  • 确实是java的bug。尽管上面链接中引用的错误从未得到验证,但它准确地描述了我所遇到的情况以及当我安装最新的 64 位版本(版本 1.6.0_34-b04)时,程序运行完成而没有错误。谢谢你,埃利奥特
猜你喜欢
  • 2015-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多