- PR -

java.lang.IndexOutOfBoundsException: Index: 1, Size: 2

1
投稿者投稿内容
yocchan94
会議室デビュー日: 2008/09/02
投稿数: 3
投稿日時: 2009-01-25 13:52
お世話になっております。
現在下記の様なエラーが発生し、困っています。

【エラー内容】
java.lang.IndexOutOfBoundsException: Index: 1, Size: 2
at java.util.ArrayList.RangeCheck(ArrayList.java:572)
at java.util.ArrayList.get(ArrayList.java:347)
at ums.webapp.master.MasterBean.replaceValue(Unknown Source)
at ums.webapp.action.MasterResultAction.setRequest(Unknown Source)
at ums.webapp.action.MasterResultAction.doExecute(Unknown Source)
at ums.webapp.action.UmsAction.execute(Unknown Source)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)


JavaのAPIをみる限りでは

例外:
IndexOutOfBoundsException - インデックスが範囲外の場合 (index < 0 || index >= size())

となっている為、今回は index < sizeなのでこのエラーは起きないと思っているのですが。。。


【ソース MasterBean#replaceValue】
public void replaceValue(String paramName,String columnName,String mae,String ato)
{
if ( inputField == null)
return;

try{
int i = Integer.parseInt(paramName.substring(1));
InputField in = (InputField)inputField.get((i-1));
ArrayList columnNames = in.getColumnName();
for(int cnt = 0;cnt<columnNames.size();cnt++){
String columnName2 = (String)columnNames.get(cnt);
if ( in != null && columnName.equals(columnName2) && mae.equals(in.getValue())){
//in.setColumnName(ato);
replace(i,ato);
}
}
}catch(NumberFormatException e){}
}




このエラーに関して
ご存知のかたがいましたら、アドバイスよろしくお願いします!
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2009-01-25 14:37
引用:

yocchan94さんの書き込み (2009-01-25 13:52) より:
java.lang.IndexOutOfBoundsException: Index: 1, Size: 2
at java.util.ArrayList.RangeCheck(ArrayList.java:572)
at java.util.ArrayList.get(ArrayList.java:347)


以下、あまり調べずに回答しますが、やはりおっしゃるようにこういうエラーは起こりえないように思います。

実際のエラーも Index: 1, Size: 2 という値なのでしょうか?それともこの 1 と 2 という数字は例として挙げられたのであって、実際は違う値だということはないでしょうか?

ほかに推理として考えられるのは、このスタックトレースを採取してメールなどで転送している内に、元は
コード:
java.lang.IndexOutOfBoundsException: Index: -1, Size: 2


だったものが、マイナスの文字がなんらかの理由で抜け落ちた、などということはないでしょうか?

あとは、マルチスレッドで複数のスレッドからこの ArrayList のオブジェクトに同時にアクセスしていて、あるスレッドで Index の取得と Size の取得のタイミングがズレて、その間に別のスレッドからオブジェクトが変更された、ということも可能性としてはゼロではないとは思いますが、発生頻度は低く、そう頻繁に遭遇するものでもないかなと思います。
yocchan94
会議室デビュー日: 2008/09/02
投稿数: 3
投稿日時: 2009-01-25 15:25
unibonさん
返信ありがとうございます。

unibonさんのおっしゃるとおり、1スレッドの処理ではエラーが発生せず、マルチスレッド(今回は負荷テストでユーザ数を増やしています)環境で起こるようです。
マイナスの文字がなんらかの理由で抜け落ちたということはないです。

MasterBeanのArrayListオブジェクト
InputField in = (InputField)inputField.get((i-1));
の部分で発生しているエラーだと思うのですが…

このMasterBeanですが
APサーバ起動時にMapに格納し、1スレッドが利用する際にMapから取得し
そのディープコピーを使用するようにしております。

MasterBeanは1スレッドに対して1なので
複数スレッドでも問題ないと思っているのですが、BasterBeanの
この見解が間違っているのでしょうか…




yocchan94
会議室デビュー日: 2008/09/02
投稿数: 3
投稿日時: 2009-01-25 19:40
お世話になっております。

マルチスレッドで複数のスレッドからこの ArrayList のオブジェクトに同時にアクセスしていることがわかりました。

unibonさん
情報ありがとうございました。
とても参考になりました。
1

スキルアップ/キャリアアップ(JOB@IT)