1

このエラーが発生する理由:

java.lang.IndexOutOfBoundsException: インデックス: 4 、サイズ: 4

私は何も定義しておらず、正常に動作している別のサーブレットで同じロジックを使用しています。私の他のサーブレットでは、すべての製品を選択しているので、2 つの配列リストを使用しました。ここで試してみましたが、それでも同じエラーが発生します。エラーを明確に理解していますが、この構文でエラーを解決する方法がわかりません。

ありがとうございました。

ConnectionPool pool = ConnectionPool.getInstance();
Connection connection = pool.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;

int product_id =Integer.parseInt(req.substring(req.lastIndexOf("/")+1));  

ArrayList al = null;
String query = "select * from Product where product_id="+product_id;

try {
    ps = connection.prepareStatement(query);
    rs = ps.executeQuery(query);

    while (rs.next()) {
        al = new ArrayList();

        al.add(rs.getString("product_id"));
        al.add(rs.getString("product_name"));
        al.add(rs.getString("product_description"));
        al.add(rs.getDouble("product_price"));
    }

このサーブレットの次の JSP ページは次のとおりです。

    <%! 
        String product_id=""; 
        String product_name=""; 
        String product_description=""; 
        double product_price = 0; 
    ArrayList  productList=null; 
    %> 

    <% 
    if(request.getAttribute("productList")!=null && request.getAttribute("productList")!="") { 
        productList = (ArrayList)request.getAttribute("productList"); 
        product_id = productList.get(1).toString(); 
        product_name = productList.get(2).toString(); 
        product_description = productList.get(3).toString(); 
        product_price = (Double) productList.get(4);
    } 
    %>
4

4 に答える 4

5

この行でその例外が発生している可能性があります

int product_id =Integer.parseInt(req.substring(req.lastIndexOf("/")+1));

コードから、これが唯一のケースである可能性があります。req index で subString() を呼び出すと、範囲外になります。最良のテストは、sysout を req の長さにすることです。

スタックトレースの投稿後に編集

Javaコードをこれに変更してください al = new ArrayList();
while (rs.next()) { al.add(rs.getString("product_id")); // インデックス 0 の al に格納 al.add(rs.getString("product_name"));// インデックス 1 の al に格納 al.add(rs.getString("product_description"));// に格納インデックス 2 の al al.add(rs.getDouble("product_price"));// インデックス 3 の al に格納 }

ここで例外をスローします

 line1:  product_id = productList.get(1).toString(); 
 line2:               product_name = productList.get(2).toString(); 
 line3:               product_description = productList.get(3).toString(); 
 line4               product_price = (Double) productList.get(4); /// its going indexoutfbound    here

リストには 4 つの要素しかなく、上記のコードで 5 番目の要素を取得しようとしています。}

それらをに変更します

  product_id = productList.get(0).toString(); 
                product_name = productList.get(1).toString(); 
                product_description = productList.get(2).toString(); 
                product_price = (Double) productList.get(3);
} 
于 2012-09-21T20:29:03.283 に答える
3
int product_id =Integer.parseInt(req.substring(req.lastIndexOf("/")+1));

次のような URL がある場合: http://www.yahoo.com/

lastIndexOf は 21 を返し、+1 は範囲外の 22 を返します。

EDIT: サーブレットページを貼り付けた後、arrayListにアクセスするためのインデックスで混乱しているように見えることに気付きました。1 IIRC ではなく 0 から開始します。そう:

if(request.getAttribute("productList")!=null && request.getAttribute("productList")!="") 
    { 
                    productList = (ArrayList)request.getAttribute("productList"); 
                    product_id = productList.get(1).toString(); 
                    product_name = productList.get(2).toString(); 
                    product_description = productList.get(3).toString(); 
                    product_price = (Double) productList.get(4);
    } 

 if(request.getAttribute("productList")!=null && request.getAttribute("productList")!="") 
        { 
                        productList = (ArrayList)request.getAttribute("productList"); 
                        product_id = productList.get(0).toString(); 
                        product_name = productList.get(1).toString(); 
                        product_description = productList.get(2).toString(); 
                        product_price = (Double) productList.get(3);
        } 
于 2012-09-21T20:29:18.433 に答える
0

エラーは次のとおりです。

**java.lang.IndexOutOfBoundsException: Index: 4, Size: 4**
 at java.util.ArrayList.RangeCheck(ArrayList.java:547)
 at java.util.ArrayList.get(ArrayList.java:322)
 at org.apache.jsp.admin.editproduct_jsp._jspService(editproduct_jsp.java:82)

そして、arraylist に 4 つの要素しかないときに、要素番号 5 (index=4) を取得しようとしたと言っています。このスタック トレースは、投稿に表示されているコードのエラーではないようです。私の推測では、要素が 4 つしかなく、5 つ目の要素を取得しようとした「a1」ArrayList をループすると、後でエラーが発生します。

于 2012-09-21T21:05:39.850 に答える
-1
while (rs.next()) {
        al = new ArrayList();

        al.add(rs.getString("product_id"));
        al.add(rs.getString("product_name"));
        al.add(rs.getString("product_description"));
        al.add(rs.getDouble("product_price"));
    }

ループ内で配列リストを初期化しています。それも問題になる可能性があります。答えは私が推測する他の人によって与えられます

于 2012-09-21T20:28:49.877 に答える