1

为什么我会收到此错误:

java.lang.IndexOutOfBoundsException:索引:4,大小:4

我没有定义任何东西,并且在另一个运行良好的 servlet 上使用了相同的逻辑。在我的另一个 servlet 中,我选择了所有产品,所以我使用了两个数组列表:一个在另一个里面。我在这里尝试过,但仍然有同样的错误。我清楚地理解了这个错误,但我不知道如何用这种语法解决它。

谢谢你。

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"));
    }

此 servlet 的下一个 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 上调用 subString() 时,索引超出范围。最好的测试是把一个系统输出到 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.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));

如果你有这样的网址: http ://www.yahoo.com/

lastIndexOf 会给你 21 和 +1 给 22 超出范围。

编辑: 粘贴 servlet 页面后,我注意到您似乎对访问 arrayList 的索引感到困惑。您从 0 而不是 1 IIRC 开始。所以:

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(索引= 4)。似乎此堆栈跟踪不是您在帖子中显示的代码的错误。我的猜测是,当循环只有 4 个元素并试图获得第五个元素的“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 回答