これは、jre 1.6ランタイム環境を使用し、64ビットサーバーServer2008R2で実行されている非常に単純なコードのチャンクです。
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();
}
}
........
私が見つけたのは、ステートメント(約10行下)が文字列の長さよりも大きいpos = tempText.toUpperCase().indexOf(aHeader);
文字列の値に断続的に設定されていることです。tempText
これにより、がjava.lang.StringIndexOutOfBoundsException
。インデックスは常に文字列の実際の長さの100以内にあります。たとえば、私が今夜実行したテストでは、pos
変数は長さ24404の文字列に対して24432に設定されました。ヘッダーの長さは、以下のコメントの1つに対処するために、大文字の前後で同じです。同じファイルでコードを2回続けて再実行しても、2回目はエラーが発生しないことに注意してください。
いくつかの追加情報:
- 使用されているスレッドは1つだけなので、スレッドの問題はないと思います。
- コードは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ワークステーションで実行されています。
これは環境の問題だと思います。エラーの奇妙さと、64ビットのテスト環境でしか表示されないという事実を教えてください。問題の原因を突き止めようとしています。過去にこの種のエラーがあった人はいますか?この種のエラーを引き起こす可能性のあるこの特定のJavaビルドに関連するバグを知っている人はいますか?
この問題をトラブルシューティングする方法について何かアイデアはありますか?
ありがとうございました、
エリオット