🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

ラジオボタン

ラジオボタンはフォームに使われる要素のひとつであり、ユーザに限られた選択肢からひとつの答えを選んでもらうというものです。

Q&A

1回答

5379閲覧

IndexOutOfBoundsExceptionの対処法について

naotaro0704

総合スコア19

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

ラジオボタン

ラジオボタンはフォームに使われる要素のひとつであり、ユーザに限られた選択肢からひとつの答えを選んでもらうというものです。

0グッド

0クリップ

投稿2019/09/20 08:16

編集2019/09/20 08:18

前提・実現したいこと

javaでの削除処理についてです。
ラジオボタン選択時に削除処理を行うプログラムを作っています。明細追加で商品をいくつか追加した後削除処理を行う際にエラーが発生してしまっています。
対処法を教えていただきたいです。

発生している問題・エラーメッセージ

IndexOutOfBoundsExceptionが発生してしまっています

java.lang.IndexOutOfBoundsException: Index: 4, Size: 4 java.util.ArrayList.rangeCheck(ArrayList.java:653) java.util.ArrayList.remove(ArrayList.java:492) jp.practice.sales.RecordManager.remove(RecordManager.java:77) jp.practice.sales.SalesSystemController.remove(SalesSystemController.java:210)

該当のソースコード

SalesSystemController.java

java

1 2@Controller 3@RequestMapping(value = "/system") 4public class SalesSystemController { 5 6 private static final Logger logger = LoggerFactory.getLogger(SalesSystemController.class); 7 8 /** Stringの定数として次の3つを定義する */ 9 private static final String INIT = "init"; 10 private static final String ADD = "add"; 11 private static final String FIX = "fix"; 12 /** メッセージと定義 */ 13 private static final String ERRMSG = "1以上の数字を入力してください。"; 14 private static final String ADDMSG = "明細に追加しました。"; 15 private static final String FIXMSG = "以下のように売上登録しました。"; 16 private static final String DELMSG = "選択された明細行を削除しました。"; 17// private static final String REMMSG = "明細行を選択してください。"; 18 19 /** 初期画面を呼び出す処理 */ 20 /** アノテーション情報として/startを受け入れる */ 21 @RequestMapping(value = "/start") 22 /** SalesFormの引数をformに、Modelの引数をmodelに指定する*/ 23 public String init(SalesForm form, Model model) { 24 25 26 27 28 /** 明細追加画面での削除押下時の処理 */ 29 @RequestMapping(params = "remove") 30 public String remove(SalesForm form, BindingResult result, Model model) { 31 32 /** 33 * RecordManagerのitemListを取得 itemListという名前でmodelに登録する。 34 */ 35 model.addAttribute("ItemList", RecordManager.getItemList()); 36 /** 37 * formのquantityを取得し、addDataという名前でmodelに登録する。 38 */ 39 model.addAttribute("addData", form.getQuantity()); 40 41 42 /** 削除処理 */ 43 44 System.out.println(form.getId()); 45 /** 46 * RecordManaagerのremoveメソッドを実行させる。 47 */ 48 RecordManager.remove(form.getPos()); 49 50 /** 商品の残りの数による条件分岐 */ 51 52 /** 売上明細の残りが1件以上の処理 */ 53 if (RecordManager.getSelectList().size() > 0) { 54 /** 55 * DELETEをmessage4という名前でmodelに登録する 56 */ 57 model.addAttribute("message4", DELMSG); 58 /** 59 * RecordManagerのselectListを取得し、allListという名前でmodelに登録する。(売上明細) 60 */ 61 model.addAttribute("allList", RecordManager.getSelectList()); 62 /** 63 * RecordManagerのitemListを取得 itemListという名前でmodelに登録する。 64 */ 65 model.addAttribute("ItemList", RecordManager.getItemList()); 66 /** 67 * RecordManagerのtotalを取得しtotalという名前でmodelに登録する。(合計) 68 */ 69 model.addAttribute("total", RecordManager.getTotal()); 70 /** 71 * 明細追加画面へ 72 */ 73 return ADD; 74 } 75 /** 売上明細の残りが0件のときの処理 */ 76 else { 77 /** 78 * DELETEをmessage4という名前でmodelに登録する 79 */ 80 model.addAttribute("message4", DELMSG); 81 /** 82 * 初期画面へ 83 */ 84 return INIT; 85 } 86 } 87

RecordManager.java

java

1public final class RecordManager<selectList> { 2 3 /** 商品データ */ 4 private static List<Item> list = new ArrayList<>(); 5 private static List<Item> selectList = new ArrayList<>(); 6 private static Item item; 7 /** totalを定義 */ 8 private static int total = 0; 9 private static long salesId; 10 private static int pos; 11 12 static { 13 list.add(new Item("A00101", "油性ボールペン", 60, 0, 0)); 14 list.add(new Item("A00201", "極細ボールペン", 120, 0, 0)); 15 list.add(new Item("A00301", "蛍光ペン6色セット", 420, 0, 0)); 16 list.add(new Item("A00401", "シャープペンシル", 100, 0, 0)); 17 list.add(new Item("A00501", "鉛筆H(1ダース)", 400, 0, 0)); 18 19 } 20 21 /** 商品名 */ 22 public static List<Item> selectItem(String id, int quantity) { 23 24 for (int i = 0; i < list.size(); i++) { 25 26 if (id.equals(list.get(i).getId())) { 27 28 /** Itemを再定義 */ 29 Item item = new Item(id,list.get(i).getName(), list.get(i).getPrice(), quantity, 30 quantity * list.get(i).getPrice()); 31 32 selectList.add(item); 33 /** subtotalを定義 */ 34 int subtotal = quantity * list.get(i).getPrice(); 35 total = total + subtotal; 36 37 break; 38 } 39 40 } 41 42 return selectList; 43 44 } 45 46 /** 選択した売上明細を削除 */ 47 public static void remove(int pos) { 48 /** int型jを定義しselectListの要素内で繰り返し処理*/ 49 for (int j = 0; j < selectList.size();j++) { 50 /** 選択したposと同じ順番の要素をselectList内から探す*/ 51 if (pos==selectList.get(j).getPos()){ 52 /** 合計からpos番目の小計を引く */ 53 total = total - selectList.get(pos).getSubtotal(); 54 55 break; 56 } 57 /** selectListのpos番目を削除 */ 58 selectList.remove(pos); 59 System.out.println(getPos()); 60 } 61 }

SalesForm.java

java

1ublic class SalesForm implements Serializable { 2 private static final long serialVersionUID = 1L; 3 4 5 6 /** 商品id */ 7 private String id; 8 /** 商品名 */ 9 private String name; 10 /** 単価 */ 11 private int price; 12 /** 個数 */ 13 @NotNull 14 @Min(1) 15 private int quantity=1; 16 /** 小計 */ 17 private int subtotal; 18 private int pos; 19 20 public SalesForm() { 21 22 } 23 24/** getterとsetterは省略してます。*/ 25 26}

add.jsp

jsp

1<body> 2 <form:form modelAttribute="salesForm" action="/sales/system"> 3 <div class="header"> 4 <span class="titleName">直太郎オンラインショップ</span> 5 <div class="date"><%=LocalDate.now()%></div> 6 </div> 7 <div class="main"> 8 <div> 9 商品: 10 <form:select path="id"> 11 12 <form:options items="${ItemList}" itemValue="id" itemLabel="name" /> 13 14 </form:select> 15 16 <br /> 17 </div> 18 <div> 19 <span class="itemQuantity">点数:</span> 20 <form:input path="quantity" size="20" /> 21 </div> 22 23 <div class="add"> 24 <div> 25 <input type="submit" name="addition" value="明細追加" /> 26 </div> 27 </div> 28 </div> 29 30 <br> 31 <div class="message"> 32 <font color="#ff0000"> <c:out value="${message1}" /> 33 </font> <font color="#1e90ff"> <c:out value="${message2}" /> <font 34 color="#1e90ff"> <c:out value="${message4}" /> 35 </font> 36 </font> <font color="#ff0000"> <c:out value="${message5}" /> 37 </font> 38 </div> 39 <br> 40 41 42 43 <div class=""> 44 <span class="details">売上明細</span> 45 46 <table class="product"> 47 48 <tr> 49 <th>削除</th> 50 <th>商品ID</th> 51 <th>商品名</th> 52 <th>単価</th> 53 <th>点数</th> 54 <th>小計</th> 55 </tr> 56 <c:forEach items="${allList}" var="allList" varStatus="status"> 57 <tr> 58 <th class="itemradiobtn"><form:radiobutton path="pos" 59 label="" value="${status.index}"/></th> 60 <th class="id">${allList.id}</th> 61 <th class="name">${allList.name}</th> 62 <th class="price">${allList.price}</th> 63 <th class="quantity">${allList.quantity}</th> 64 <th class="subtotal">${allList.subtotal}</th> 65 </tr> 66 </c:forEach> 67 </table> 68 </div> 69 70 <div class="total"> 71 合計: 72 <fmt:formatNumber groupingUsed="true"> 73 <c:out value="${total}" /> 74 </fmt:formatNumber> 7576 </div> 77 78 79 <div class="footer"> 80 81 <input type="submit" name="remove" value="削除" 82 onclick="remove_row(this)" /> <input type="submit" name="firm" 83 value="確定" /> 84 </div> 85 86 </form:form> 87 88</body> 89</html>

試したこと

IndexOutOfBoundsExceptionについて調べると、indexの上限が256でindex256、size256のときは、上限を引き上げる方法などが出てきましたがやり方が256までいっていないので違うやり方があるのだろうと思いました。
Index: 4, Size: 4ということなので、inedxは0,1,2,3で4が指定されたらエラーが起きるのはわかりました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

配列やリストの範囲外を指定するからその例外が出るんですから、
前もってそいつのサイズを見て、範囲外かどうかを判定すればどうでしょう

投稿2019/09/20 08:57

y_waiwai

総合スコア88040

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

naotaro0704

2019/09/24 00:05

回答ありがとうございます。 実際に判断する豊富としてはどうしたらよいでしょうか。
y_waiwai

2019/09/24 00:17

その例外が出る行で、配列やリストのsizeを見て、インデックスと比較すればいいだけでは。 まあ、そもそも範囲外のアクセスが出る時点でそのコードがおかしいってことなんでそこからどうにかしないといけないですが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問