我正在尝试从我创建的arrayList计算线段(长度)。 这是在JAVA。一切都按照我想要的方式运作,但是我得到了这样的信息: “线程中的异常”主“java.lang.IndexOutOfBoundsException:索引:2,大小:2 在java.util.ArrayList.rangeCheck(未知来源) at java.util.ArrayList.get(Unknown Source) “
对于arraylist的索引具有“+1”会引起麻烦。这是导致错误消息的原因,但它确实计算了线段。它打印它们然后打印可怕的错误语句。
myPoints.get((i + 1))。x; < ---(i + 1)造成麻烦 tempYFirst = myPoints.get(i).y; < ---没有+1就能正常工作,但它不能做我想做的事。
public static void showStats(ArrayList<Point> myPoints)
{
double distance = 0.0;
double length;
double tempX;
double tempY;
double tempX2;
double tempY2;
int tempFirst;
int tempSecond;
int tempYFirst;
int tempYSecond;
int xValue;
int yValue;
// Line segments are calculated by the distance formula of:
// Sqrt ( (x2-x1)^2 + (y2-y2)^2)
for (int i = 0; i < myPoints.size(); i++) {
tempFirst = myPoints.get(i).x;
tempSecond = myPoints.get((i+1)).x ;
tempYFirst = myPoints.get(i).y;
tempYSecond = myPoints.get((i+1)).y;
xValue = tempFirst - tempSecond;
yValue = tempYFirst - tempYSecond;
tempX2 = Math.pow(xValue, 2);
tempY2 = Math.pow(yValue, 2);
distance += Math.sqrt((tempX2 + tempY2));
System.out.println(tempSecond);
}// /
}
答案 0 :(得分:2)
您正试图获取索引2处的Point
,但只有2个点,而Java索引中只有0
到size - 1
或1
在这种情况下。问题是这一行
tempSecond = myPoints.get((i+1)).x ;
当i
为1时,i + 1
为2
且超出范围。在上一个Point
时,最好与第一个Point
进行比较以完成循环:
tempSecond = myPoints.get((i+1) % myPoints.size()).x ;
这使用%
模运算符在除以myPoints.size()
时得到余数,这样当i + 1
变得太大时,0
就是结果,即余数将size
除以size
时0
。
答案 1 :(得分:1)
尝试以1开始循环。这样你就不会遇到索引越界的问题......
for (int i = 1; i < myPoints.size(); i++) {
tempFirst = myPoints.get(i-1).x;
tempSecond = myPoints.get((i)).x ;
tempYFirst = myPoints.get(i-1).y;
tempYSecond = myPoints.get((i)).y;
xValue = tempFirst - tempSecond;
yValue = tempYFirst - tempYSecond;
tempX2 = Math.pow(xValue, 2);
tempY2 = Math.pow(yValue, 2);
distance += Math.sqrt((tempX2 + tempY2));
System.out.println(tempSecond);
}
答案 2 :(得分:0)
除了@ rgettman的回答之外,请尝试使用内置的Point2D.distance
方法,如下所示:
public static void showStats(ArrayList<Point> myPoints) {
double distance = 0.0;
for (int i = 0; i < myPoints.size(); i++) {
Point first = myPoints.get(i);
Point second = myPoints.get((i+1) % myPoints.size());
// use distance method
distance += first.distance(second);
System.out.println(second.x);
}
}