这是一段非常简单的代码,使用 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
对于长度为 24404 的字符串,变量设置为 24432。标题长度在大写之前和之后相同,以解决以下评论之一。请注意,如果我连续两次在同一文件上重新运行代码,则第二次不会发生错误。
一些附加信息:
- 我不相信这是线程问题,因为只使用了一个线程。
- 该代码在 32 位 XP 环境中运行良好。
- pos 和 tempText 都是本地定义的变量。
- 当我输入 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 构建相关的可能导致此类错误的错误?
关于如何解决这个问题的任何想法?
谢谢,
艾略特