Android 列表中的ArrayIndexOutOFBoundsException

Android 列表中的ArrayIndexOutOFBoundsException,android,list,exception,Android,List,Exception,我有一个ArrayIndexOutOfBoundsException private Size getPictureSize() { List<Size> list = camera.getParameters().getSupportedPictureSizes(); int i = 0; for (Size size : list) { if (Math.min(size.width, size.height) <= 800)

我有一个ArrayIndexOutOfBoundsException

private Size getPictureSize() {
    List<Size> list = camera.getParameters().getSupportedPictureSizes();
        int i = 0;
    for (Size size : list) {
        if (Math.min(size.width, size.height) <= 800) {
            if (Math.max(size.width, size.height) > 800) {
                return size;
            } else {

                return (i > 0 ? list.get(i - 1) : list.get(0));
            }
        }
        i++;

    }

    return list.get(0);
}

我知道这个异常意味着什么,但什么会导致它呢?

您的代码中有几个问题:

  • 此行:
    return(i>0?list.get(i-1):list.get(0))可以计算列表中不存在的索引
    
  • 如果列表为空,代码的最后一行(
    返回列表.get(0);
    )可能会引发
    索引自动边界异常
我更改了您的代码以修复这些问题。看看它是否解决了您的问题:

private Size getPictureSize() {
    List<Size> list = camera.getParameters().getSupportedPictureSizes();
    Size prevSize = null;
    for (Size size : list) {
        if (Math.min(size.width, size.height) <= 800) {
            if (Math.max(size.width, size.height) > 800) {
                return size;
            } else {
                return (prevSize == null? size : prevSize);
            }
        }
        prevSize = size;
    }

    if(list.size() > 0) {
        return list.get(0);
    }

    return null;
} 
private Size getPictureSize(){
List List=camera.getParameters().getSupportedPictureSizes();
大小prevSize=null;
用于(大小:列表){
if(数学最小值(尺寸.宽度,尺寸.高度)800){
返回大小;
}否则{
返回(prevSize==null?大小:prevSize);
}
}
尺寸=尺寸;
}
如果(list.size()>0){
返回列表。获取(0);
}
返回null;
} 

您的代码中有几个问题:

  • 此行:
    return(i>0?list.get(i-1):list.get(0))可以计算列表中不存在的索引
    
  • 如果列表为空,代码的最后一行(
    返回列表.get(0);
    )可能会引发
    索引自动边界异常
我更改了您的代码以修复这些问题。看看它是否解决了您的问题:

private Size getPictureSize() {
    List<Size> list = camera.getParameters().getSupportedPictureSizes();
    Size prevSize = null;
    for (Size size : list) {
        if (Math.min(size.width, size.height) <= 800) {
            if (Math.max(size.width, size.height) > 800) {
                return size;
            } else {
                return (prevSize == null? size : prevSize);
            }
        }
        prevSize = size;
    }

    if(list.size() > 0) {
        return list.get(0);
    }

    return null;
} 
private Size getPictureSize(){
List List=camera.getParameters().getSupportedPictureSizes();
大小prevSize=null;
用于(大小:列表){
if(数学最小值(尺寸.宽度,尺寸.高度)800){
返回大小;
}否则{
返回(prevSize==null?大小:prevSize);
}
}
尺寸=尺寸;
}
如果(list.size()>0){
返回列表。获取(0);
}
返回null;
} 

添加完整堆栈跟踪。。。像往常一样。打破
返回(i>0?list.get(i-1):list.get(0))编码到if/else中,以查看是哪个get()导致它。添加完整堆栈跟踪。。。像往常一样。打破
返回(i>0?list.get(i-1):list.get(0))编码到if/else中,以查看是哪个get()引起的。好吧,因为这是一个市场上报告的错误,所以我不确定在什么情况下发生的,以及在什么设备上发生的。因为只有一份报告,我想这只发生过一次。该应用程序在他测试的设备上运行良好,所以现在他让我找到问题并解决它。现在的问题是:如果我不知道在什么情况下或在什么设备上发生此错误,我如何测试您的代码?getSupportedPictureSizes说“此方法将始终返回至少包含一个元素的列表”。这是真的吗?PS我将发布堆栈跟踪。顺便说一句,prevSize不是总是空的吗?您初始化了它,但从未使用过它,然后使用三元运算符检查它是否为null,然后返回size,否则返回prevSize。这对我来说没有意义,但我真的没有经验,所以如果你遗漏了什么,请告诉我。(或者如果我在理解上犯了错误)谢谢你的帮助,我认为这个错误被标记为旧的和可以的;我不会再给你stacktrace了,但因为我是那种写下我在市场上看到的stacktrace在getPictureSize()的第71行显示错误的人,这可能就是三元运算符的那一行。我只是想知道为什么这只发生过一次,正如我在之前的评论中所说的,我想了解您编写的代码。正如您所看到的,“prevSize=size;”行负责分配此变量。所以prevSize并不总是空的。这与代码的行为相同,但它避免了索引越界异常,因为它不访问某些索引。好吧,因为这是一个市场上报告的错误,所以我不确定在什么情况下以及在什么设备上发生了这种情况。因为只有一份报告,我想这只发生过一次。该应用程序在他测试的设备上运行良好,所以现在他让我找到问题并解决它。现在的问题是:如果我不知道在什么情况下或在什么设备上发生此错误,我如何测试您的代码?getSupportedPictureSizes说“此方法将始终返回至少包含一个元素的列表”。这是真的吗?PS我将发布堆栈跟踪。顺便说一句,prevSize不是总是空的吗?您初始化了它,但从未使用过它,然后使用三元运算符检查它是否为null,然后返回size,否则返回prevSize。这对我来说没有意义,但我真的没有经验,所以如果你遗漏了什么,请告诉我。(或者如果我在理解上犯了错误)谢谢你的帮助,我认为这个错误被标记为旧的和可以的;我不会再给你stacktrace了,但因为我是那种写下我在市场上看到的stacktrace在getPictureSize()的第71行显示错误的人,这可能就是三元运算符的那一行。我只是想知道为什么这只发生过一次,正如我在之前的评论中所说的,我想了解您编写的代码。正如您所看到的,“prevSize=size;”行负责分配此变量。所以prevSize并不总是空的。这与代码的行为相同,但它避免了索引越界异常,因为它不访问某些索引。