我的代码在使用包含对象的ArrayList
进行测试时有效,但在arrayList
为空时会发出以下错误:
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
我出错了什么?
获取面积最小的Rectangle
返回面积最小的矩形或null
if
没有矩形。
import java.util.ArrayList;
public class RectangleList
{
ArrayList<Rectangle> list = new ArrayList<Rectangle>();
public RectangleList(ArrayList<Rectangle> theList)
{
list = theList;
}
/**
* Gets the Rectangle with the smallest area
*
* @return the rectangle with the smallest area or null if there are no
* rectangles
*
*/
public Rectangle smallestArea()
{
Rectangle currentsmallestRectangle = list.get(0);
for (int i = 0; i < list.size(); i++) {
Rectangle nextRectangle = list.get(i);
if (list.isEmpty()) {
return null;
} else if ((nextRectangle.getWidth() * nextRectangle.getHeight()) < (currentsmallestRectangle
.getWidth() * currentsmallestRectangle.getHeight())) {
currentsmallestRectangle = nextRectangle;
}
return currentsmallestRectangle;
}
}
}
答案 0 :(得分:5)
我的代码在使用包含对象的ArrayLists进行测试时工作但是输出错误java.lang.IndexOutOfBoundsException:Index:0,Size:当arrayList为空时为0。我出了什么问题。
ArrayList.get()
的行为正好as documented。
<强>抛出:强>
IndexOutOfBoundsException - 如果索引超出范围(index < 0 || index >= size()
)
没有条目,因此索引0超出范围。如果你想在没有矩形的情况下返回null
,你应该明确地这样做:
// Alternatively, if list.size() == 0
if (list.isEmpty()) {
return null;
}
请注意,顺便提一下,对空列表的引用与空引用非常不同。 (你的标题引用了一个“null arrayList” - 没有null对象这样的东西,但是可以有一个空引用...除非在你的情况下没有。)
这需要在 之前完成,否则请致电list.get(0)
- 只需要一次。 (在循环中调用它有什么意义?)例如:
public Rectangle smallestArea() {
if (list.isEmpty()) {
return null;
}
Rectangle currentsmallestRectangle = list.get(0);
// Note that you can go from 1, not 0...
for (int i = 1; i < list.size(); i++) {
Rectangle nextRectangle = list.get(i);
if ((nextRectangle.getWidth() * nextRectangle.getHeight()) <
(currentsmallestRectangle.getWidth() *
currentsmallestRectangle.getHeight())) {
currentsmallestRectangle = nextRectangle;
}
}
return currentSmallestRectangle;
}
理想情况下,在area()
类中添加Rectangle
方法,以简化循环:
for (int i = 1; i < list.size(); i++) {
Rectangle nextRectangle = list.get(i);
if (nextRectangle.area() < currentSmallestRectangle.area()) {
currentsmallestRectangle = nextRectangle;
}
}
答案 1 :(得分:0)
你基本上是试图从空列表中获取元素零。你不能这样做。
答案 2 :(得分:0)
你可以这样做:
try
{
Rectangle currentsmallestRectangle = list.get(0);
}
catch(IndexOutOfBoundsException e)
{
return 0;//Do something here to fix exception
}
或
if(!list.isEmpty())
{
Rectangle currentsmallestRectangle = list.get(0);
}
else
{
return 0;//Put something here as default. maybe a rectangle size 0.
}
您不检查列表中是否包含任何内容,因此如果您不处理它,则会出现问题。上面的两段代码可以纠正它,它们将返回0表示没有矩形。