繁体   English   中英

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

[英]java.lang.IndexOutOfBoundsException: Index: 4, Size: 4

如何解决此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);

我有点知道为什么会出错,但是我不确定如何解决该问题。

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

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

第一次循环,“ i”为零,您添加了一个元素。 不会有元素1,因此调用将引发异常。 既然我已经真正看到您的内容,它就会在第二次迭代中失败,而不是第一次迭代,就像可怜的@Giu在他现在删除的答案中指出的那样。 不过,这很奇怪,我不知道您要通过调用.get()甚至不查看返回值来尝试完成什么。

您确实必须解释您要做什么,因为按照书面说明,这实际上没有任何意义。 问题标题中的异常是否真的源于该代码,还是您在发布时将其一部分进行了编辑?

编辑 -哎呀,他们完全将“ i + i”视为“ i + 1”。 但是对我来说仍然没有意义。

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

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

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

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

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

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

即使没有问题,编写的程序也会读取查询的结果,然后对于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程序外部运行查询,然后查看获得的记录数。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM