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

时间:2010-10-07 13:16:52

标签: java arraylist

如何解决此问题OutOfBoundsException

以下是我正在使用的代码:

 ResultSet rsTagCheck = stmt.executeQuery(
     "SELECT PARKING.XKRPRMT.XKRPRMT_PIDM, PARKING.XKRPRMT.XKRPRMT_STATUS, PARKING.XKRPRMT.XKRPRMT_EXPIRE_YR, PARKING.XKRPRMT.XKRPRMT_TAG FROM PARKING.XKRPRMT WHERE XKRPRMT_PIDM ='" + BannerID + "'");
 while (rsTagCheck.next()){
     String TagNum = rsTagCheck.getString("XKRPRMT_TAG");
     ArrayList<String> myTag = new ArrayList<String>();

     for (int i = 0; i < TagNum.length(); i++){
         myTag.add(TagNum);
         myTag.get(i + i);

我知道为什么我会收到错误,但我不确定如何解决这个问题。

6 个答案:

答案 0 :(得分:12)

问题是i+i中的myTag.get(i+i)部分。它适用于i=0,但只要i=1,您就会抛出异常,因为您已向myTag添加了两个元素,但正在访问第三个元素( myTag.get(2))。

答案 1 :(得分:2)

您希望myTag.get(i + i)做什么?

第一次循环,“i”为零,你添加一个元素。没有元素1,所以调用会抛出一个异常。现在我实际上看到了你写的东西,它会在第二次迭代时失败,而不是第一次迭代,因为可怜的@Giu在他的现在删除的答案。不过,这很奇怪,我不知道你要通过调用.get()来完成什么,甚至不知道返回值。

你真的必须解释你正在尝试做什么,因为这没有任何意义。问题标题中的例外真的是来自该代码,还是在发布时编辑了部分内容?

编辑 - 哎呀完全看到“i + i”为“i + 1”。但是对我来说仍然没有意义。

答案 2 :(得分:2)

通过迭代String TagNum,您正在使用for循环。您只需要说:myTag.add(TagNum)

想象一下String TagNum有4个字符。您将String添加到列表中4次,但是当您到达i = 3时,您尝试检索位置3 + 1处的元素,但该列表包含从0到3的元素。

另外,尝试用一个?替换BannerID?并相应地将参数设置为语句。

答案 3 :(得分:1)

myTag.get(i + i);导致异常。

第一次循环i0,你将一个项添加到ArrayList中,然后调用get(0+0),这很好。

在下一次迭代中,您添加另一个元素(现在列表中总共有2个元素)并调用get(1+1),这会导致异常,因为您只有2个元素且有效索引为{{1 }和0

答案 4 :(得分:1)

即使没有get的问题,你编写的程序也会读取查询结果,然后对于tagNum中的每个CHARACTER,它会向你的数组添加一个tagNum实例。因此,如果tagNum是“ABC”,则数组将最终包含“ABC”三次。如果tagNum是“ABCD”,它将包含“ABCD”四次。这没有多大意义。

我认为你想要的只是将tagNum添加到一个数组中,定义ResultSet.next循环的数组OUTSIDE。这样的事情可能是:

 ArrayList<String> myTag = new ArrayList<String>(); 
ResultSet rsTagCheck = stmt.executeQuery( 
  "SELECT PARKING.XKRPRMT.XKRPRMT_PIDM, PARKING.XKRPRMT.XKRPRMT_STATUS,   PARKING.XKRPRMT.XKRPRMT_EXPIRE_YR, PARKING.XKRPRMT.XKRPRMT_TAG FROM PARKING.XKRPRMT WHERE XKRPRMT_PIDM ='" + BannerID + "'"); 
while (rsTagCheck.next()){ 
  String TagNum = rsTagCheck.getString("XKRPRMT_TAG"); 
  myTag.add(TagNum); 
}

(当然,这不会使用您查询中的任何其他数据,我不知道您要做的其他所有内容,但我相信您正在尝试为此部分做些什么。)

更新

假设您的数据库表中有十条记录。完成上述循环后,应填充数组。

尝试这样的事情:

ArrayList<String> myTag = new ArrayList<String>(); 
ResultSet rsTagCheck = stmt.executeQuery( 
  "SELECT PARKING.XKRPRMT.XKRPRMT_PIDM, PARKING.XKRPRMT.XKRPRMT_STATUS,   PARKING.XKRPRMT.XKRPRMT_EXPIRE_YR, PARKING.XKRPRMT.XKRPRMT_TAG FROM PARKING.XKRPRMT WHERE XKRPRMT_PIDM ='" + BannerID + "'"); 
while (rsTagCheck.next()){ 
  String TagNum = rsTagCheck.getString("XKRPRMT_TAG"); 
  myTag.add(TagNum); 
}
for (String tag : myTag)
{
  System.out.println(tag);
}

那应该会给你所有标签的列表。请注意,您必须在while(ResultSet)循环结束后检查List。在循环内部,您将只读取到目前为止的元素。

如果您仍然只获得一个值,请确保从结果集中返回多个记录。比如,在Java程序之外运行查询,看看你得到了多少记录。

答案 5 :(得分:0)

List<WebElement> div1=driver.findElements(By.xpath(".//*[@class='art_title']"));        

for(int i=0;i<=div1.size();i++)
{           
    System.out.println(div1.get(i).getText());          
    Thread.sleep(1000);
}


Instead of the above format I changed it into this format : 


List<WebElement> div1=driver.findElements(By.xpath(".//*[@class='art_title']"));
String[] abc = new String[div1.size()];

int i= 0;

for (WebElement e : div1) 
{
        abc[i] = e.getText();
        i++;            
        System.out.println(e.getText());
}