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