我有这个代码比较两个arrayLists并删除较低的斜边并返回它。
public static GeometricShape removeLowerHypotenuse(ArrayList<GeometricShape> left, ArrayList<GeometricShape> right) {
GeometricShape x = null;
if(((RightTriangle)right.get(0)).getHypotenuse() < ((RightTriangle)left.get(0)).getHypotenuse() && right.size() != 0 && left.size() != 0) {
x = right.get(0);
right.remove(0);
}
if(((RightTriangle)left.get(0)).getHypotenuse() < ((RightTriangle)right.get(0)).getHypotenuse() && right.size() != 0 && left.size() != 0) {
x = left.get(0);
left.remove(0);
}
if(right.size() != 0 && left.size() == 0) {
x = right.get(0);
}
if(right.size() == 0 && left.size() != 0) {
x = left.get(0);
}
if(right.size() == 0 && left.size() == 0) {
return left.get(0);
}
return x;
}
当两个arrayLists的大小都是1(每个中有1个元素)时,我得到一个超出范围的异常并且弄清楚为什么会这样。我不知道我的代码中缺少什么。
答案 0 :(得分:0)
您需要使用else if()
而非if()
,例如:
if(right.size() != 0 && left.size() == 0) {
x = right.get(0);
}
else if(right.size() == 0 && left.size() == 0) {
x = left.get(0);
}
else if(right.size() == 0 && left.size() != 0) {
x = left.get(0);
}
else if(((RightTriangle)right.get(0)).getHypotenuse() < ((RightTriangle)left.get(0)).getHypotenuse() && right.size() != 0 && left.size() != 0) {
x = right.get(0);
right.remove(0);
}
else if(((RightTriangle)left.get(0)).getHypotenuse() < ((RightTriangle)right.get(0)).getHypotenuse() && right.size() != 0 && left.size() != 0) {
x = left.get(0);
left.remove(0);
}
在您的代码中,如果ArrayList right
有一个元素,并且第一个if()
情况为真,那么right
的第一个元素将被移除,留下它{{ 1}}。
在随后的null
语句中,当调用if()
时,会抛出right.get(0)
。
因此,你应该使用else-if语句。
此外,如果其中一个ArrayLists为空,那么通过您的代码,在第一个if语句中,将抛出IndexOutOfBoundsException
。因此,我重新安排了一些条件。
希望它有所帮助!
答案 1 :(得分:0)
当您获得 IndexOutOfBoundsException 时,这意味着您正在尝试使用其值大于列表大小的索引值从列表中访问对象。在使用列表时,您始终需要注意这一点,阵列。
如果您执行第一次 if条件,右侧列表中的对象已被删除, IndexOutOfBoundsException 将会出现。
当两个列表大小均为1且您从右侧列表中删除一个对象时,右侧列表的大小将变为 0 。在你的下一个条件中,你正在尝试这个
<强>直角三角形)right.get(0))。getHyp 强> otenuse() 当右的大小为 0 时,列表。所以索引0 列表中没有任何内容 这是您在代码
中获得 IndexOutOfBoundsException 的原因在列表上执行任何操作之前,先更改条件并检查大小,如下所示
public static GeometricShape removeLowerHypotenuse(ArrayList<GeometricShape> left, ArrayList<GeometricShape> right) {
GeometricShape x = null;
if(right.size() != 0 && left.size() != 0 && ((RightTriangle)right.get(0)).getHypotenuse() < ((RightTriangle)left.get(0)).getHypotenuse() ) {
x = right.get(0);
right.remove(0);
}
if(right.size() != 0 && left.size() != 0 && ((RightTriangle)left.get(0)).getHypotenuse() < ((RightTriangle)right.get(0)).getHypotenuse() ) {
x = left.get(0);
left.remove(0);
}
if(right.size() != 0 && left.size() == 0) {
x = right.get(0);
}
if(right.size() == 0 && left.size() != 0) {
x = left.get(0);
}
if(right.size() == 0 && left.size() == 0) {
return left.get(0);
}
return x;
}
使用此代码仍然会得到 IndexOutOfBoundsException ,因为在您尝试从空列表中访问的最后一个条件中,您需要在上一个代码中更改此代码