【问题标题】:Arraylist Checking Out of Bounds Index Produces CrashArraylist 检查越界索引会导致崩溃
【发布时间】:2014-09-09 11:24:40
【问题描述】:

所以我有这段代码遍历 ArrayList 并将其内容添加到 Imageview。我正在检查 ArrayList 在某个索引处是否为空以阻止它处理代码,但问题是它在检查条件时崩溃,即这个 picturePathResults.get(i) != null 给我一个越界异常。这通常发生在 ArrayList 中有一个元素时,它会遍历第一个也是唯一一个元素,然后在第二个循环期间检查时崩溃。我不明白为什么当条件应该阻止这种情况发生时它会崩溃。

  for(int i=0; i < allEDs.size(); i++){ 
        LinearLayout singleOptionContainer =new LinearLayout(this.getApplicationContext());
        ETResults[i] = allEDs.get(i);
        if(picturePathResults.size() != 0 ){
            if(picturePathResults.get(i) != null){
                picturePathResult = picturePathResults.get(i);
                imagesContainer = new ImageView(QuestionCollector.this);
                imagesContainer.setId(imageViewTemplateID);   
                imagesContainer.setBottom(editTextTemplateID);
                imagesContainer.setLayoutParams(imageParams);
                image = BitmapFactory.decodeFile(picturePathResult);
                scaledBitmap = scaleImage(image, 330, 330, 330, true);
                imagesContainer.setImageBitmap(scaledBitmap);   
                singleOptionContainer.addView(imagesContainer);
            }else{
                return;
            }
        }
}

【问题讨论】:

  • 检查图片路径结果列表的 i 和大小。你可以找出错误
  • 试试if ( i &lt;= picturePathResults.size()) 而不是if(picturePathResults.size() != 0 )

标签: java android indexoutofboundsexception


【解决方案1】:

您检查 picturePathResults 中是否有一些元素 - 然后获取 ith 元素。

替换if(picturePathResults.size() != 0 ){

if(picturePathResults.size() &gt; i ){

这应该停止尝试获取不存在的索引

【讨论】:

  • 这适用于一个小的编辑,即这个 picturePathResults.size() > i,因为循环的第二次迭代将有索引 i比列表大。将此标记为已回答,谢谢。
  • 你当然是正确的 - 基于 0 的数组.. 现在修复它
【解决方案2】:

Collet89 已经回答了如何快速更正您的条件语句以免超出范围,但值得澄清的是,您对 picturePathResults.get(i) != null 的检查将无法执行您想要的检查。

问题是你试图查看i处的数组值是否存在,但为了做到这一点,你必须请求i处的值,所以你的代码会在之前抛出一个IndexOutOfBoundsException它甚至可以进行空检查。正如 Collet89 暗示的那样,您需要在尝试访问值之前检查 Array 的元数据(其大小),以确保您不会越界。

您的检查正在验证 picturePathResults.get(i) 中包含的值不为空,但如果数组的长度不足以在索引 i 处包含值,它将失败

【讨论】:

  • 感谢您的解释。
【解决方案3】:

查看 ArrayList 文档会告诉你为什么会出现异常: http://developer.android.com/reference/java/util/ArrayList.html#get(int)

您正在尝试迭代您在 for 循环中不知道大小的 ArrayList,其迭代次数可能与 picturePathResults 的大小不同,所以 如果您的索引将 >= picturePathResults.size() 那么 BOOM 你会得到异常。

if((picturePathResults.get(i) != null)&&(i < picturePathResults.size()))

这应该会有所帮助

【讨论】:

    【解决方案4】:

    您检查正确,如果picturePathResults 中有东西,但这并不意味着索引为i 的元素存在。而且get(i)不会改变picturePathResults的大小,你可以使用remove(i)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      相关资源
      最近更新 更多