- - PR -
java.lang.IndexOutOfBoundsException: Index: 1, Size: 2
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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){} } このエラーに関して ご存知のかたがいましたら、アドバイスよろしくお願いします! | ||||||||
|
投稿日時: 2009-01-25 14:37
以下、あまり調べずに回答しますが、やはりおっしゃるようにこういうエラーは起こりえないように思います。 実際のエラーも Index: 1, Size: 2 という値なのでしょうか?それともこの 1 と 2 という数字は例として挙げられたのであって、実際は違う値だということはないでしょうか? ほかに推理として考えられるのは、このスタックトレースを採取してメールなどで転送している内に、元は
だったものが、マイナスの文字がなんらかの理由で抜け落ちた、などということはないでしょうか? あとは、マルチスレッドで複数のスレッドからこの ArrayList のオブジェクトに同時にアクセスしていて、あるスレッドで Index の取得と Size の取得のタイミングがズレて、その間に別のスレッドからオブジェクトが変更された、ということも可能性としてはゼロではないとは思いますが、発生頻度は低く、そう頻繁に遭遇するものでもないかなと思います。 | ||||||||
|
投稿日時: 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の この見解が間違っているのでしょうか… | ||||||||
|
投稿日時: 2009-01-25 19:40
お世話になっております。
マルチスレッドで複数のスレッドからこの ArrayList のオブジェクトに同時にアクセスしていることがわかりました。 unibonさん 情報ありがとうございました。 とても参考になりました。 |
1