Android 列表中的ArrayIndexOutOFBoundsException
我有一个ArrayIndexOutOfBoundsExceptionAndroid 列表中的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)
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并不总是空的。这与代码的行为相同,但它避免了索引越界异常,因为它不访问某些索引。