【问题标题】:IndexOutOfBoundException for ArrayListArrayList 的 IndexOutOfBoundException
【发布时间】:2016-11-03 11:27:00
【问题描述】:

我的代码

public List<GeoPoint> compute_polygon(List<GeoPoint> waypoints, double d)
        {
            int N = waypoints.size();//25
            int T = 2 * N - 1;//49
//          GeoPoint[] reduced_waypoints = waypoints.toArray(new GeoPoint[waypoints.size()]);
            List<GeoPoint> polygon =  new ArrayList<GeoPoint>(T);
            for (int i = 1; i < N - 1; i++)
            {

                GeoPoint M = get_disp(waypoints.get(i - 1), waypoints.get(i), waypoints.get(i + 1), d);
                polygon.add(i, v_add(waypoints.get(i), M));// here it fails and throws exception. 
                polygon.add(T-i, v_sub(waypoints.get(i), M));
            }
}

错误输出

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 1, Size: 0
    at java.util.ArrayList.rangeCheck(ArrayList.java:653)
    at java.util.ArrayList.set(ArrayList.java:444)
    at de.carbook.vendor.search.PathPolygon.compute_polygon(PathPolygon.java:40)
    at de.carbook.vendor.search.Cleansing_the_waypoints.main(Cleansing_the_waypoints.java:41)

我无法找出导致问题的原因。

错误在polygon.add(i, v_add(waypoints.get(i), M));这里失败并抛出异常。

我试过polygon.add(index,element)polygon.set(index,element) 两种情况都失败了

在调试时我发现这一行 List&lt;GeoPoint&gt; polygon = new ArrayList&lt;GeoPoint&gt;(T); 被初始化为 null(空)。有问题吗?

更新 1

public List<GeoPoint> compute_polygon(List<GeoPoint> points, double d)
        {
            int N = points.size();//25
            int T = 2 * N - 1;//49
            GeoPoint[] waypoints = points.toArray(new GeoPoint[N]);
            GeoPoint[] polygon = new GeoPoint[T];
            for (int i = 1; i < N - 1; i++)
            {
                GeoPoint M = get_disp(waypoints[i - 1], waypoints[i], waypoints[i + 1], d);
                polygon[i]     = v_add(waypoints[i], M); 
                polygon[T - i] = v_sub(waypoints[i], M);
            }
            GeoPoint A = v_mul(v_nor(v_prp(v_sub(waypoints[1], waypoints[0]))), d);
            GeoPoint B = v_mul(v_nor(v_prp(v_sub(waypoints[N-1], waypoints[N-2]))), d);
            polygon[0] = v_add(waypoints[0], A); polygon[T] = v_sub(waypoints[0], A);
            polygon[N - 1] = v_add(waypoints[N-1], B); polygon[N] = v_sub(waypoints[N-1], B);

            List<GeoPoint> poly =  new ArrayList<GeoPoint>(Arrays.asList(polygon));
            System.out.println(poly);

            return poly;
        }

更新错误

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 49
    at de.carbook.vendor.search.PathPolygon.compute_polygon(PathPolygon.java:67)
    at de.carbook.vendor.search.Cleansing_the_waypoints.main(Cleansing_the_waypoints.java:41)

【问题讨论】:

  • 使用polygon.add( v_add(waypoints.get(i), M)) 而不是polygon.add(i, v_add(waypoints.get(i), M))
  • @Jens 但我需要这些索引来按顺序排列点。
  • 但是你用两个语句以相同的顺序添加它。
  • i=0而不是1开始循环。
  • 编辑后:polygon[T] -> 大小为 T ,因此您的最大允许索引为 T-1。

标签: java arraylist initialization runtime-error indexoutofboundsexception


【解决方案1】:

这是因为您尝试在特定索引处插入,而该索引不存在。 List&lt;GeoPoint&gt; polygon = new ArrayList&lt;GeoPoint&gt;(T); 只是告诉它应该在内存中占用这么多大小。如果您不提及容量,则内部数组将不得不随着列表的增长而重复重新分配。

使用这个:

polygon.add( v_add(waypoints.get(i), M)) 

【讨论】:

  • @ShreyasRaoB 您事先知道大小并且想要插入特定索引。所以使用数组。但请注意,由于您从 i=1 开始,它将保留索引 0 = null。
  • @Fildor 检查UPDATE1
【解决方案2】:

您不应该在新的 ArrayList 上使用索引插入。 ArrayList 在内部使用根据其长度动态增长的数组。所以请改用 add(Object)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-10
    相关资源
    最近更新 更多