如何修复此运行时错误:java.lang.IndexOutOfBoundsException

时间:2014-11-29 22:21:46

标签: java arraylist

这是我的代码。它编译没有错误。执行时,运行时错误是

java.lang.IndexOutOfBoundsException
  at java.util.ArrayList.rangeCheck(Unknown Source)
  at java.util.ArrayList.get(Unknown Source)

有问题的行被评论。我不确定出了什么问题,但我是ArrayLists新手。

import java.awt.geom.*;
import java.util.Iterator;
import java.util.ArrayList;
import java.util.Scanner;
import gpdraw.*;

public class ArrayListTest {
    private ArrayList<Point2D.Double> myPolygon = 
            new ArrayList<Point2D.Double> (20);
    private Scanner scan = new Scanner(System.in);

    public ArrayListTest(){
        process();
        draw();
    }

    private void process(){
        double x, y;
        System.out.println("Enter a set of coordinate points that will"
                + "be used to create an irregular polygon. ");
        System.out.println("Use this format: x y" 
                + "\nEnter 911 to draw polygon.");
        while(1 > 0){
            System.out.print("Enter a point: ");
            x = scan.nextDouble();
            if(x == 911) { break; }
            else{
                y = scan.nextDouble();
                Point2D.Double pt = new Point2D.Double(x, y);
                addPt(pt);}
            }
        }
    }

    public void addPt(Point2D.Double pt){
        myPolygon.add(pt);
    }

    public void draw(){
        SketchPad paper = new SketchPad(400, 400);
        DrawingTool pen = new DrawingTool(paper);
        Iterator <Point2D.Double> iter = myPolygon.iterator();
        pen.up();
        double x  = myPolygon.get(0).getX();
        double y = myPolygon.get(0).getY();
        pen.move(x, y);
        pen.down(); 
        int i = 1; 
        while(iter.hasNext()){
            x = myPolygon.get(i).getX(); //The error is actually on this line,
            y = myPolygon.get(i).getY();
            pen.move(x, y);
            i++;
        }
        pen.move(myPolygon.get(0).getX(), myPolygon.get(0).getY());
    }

    public static void main(String[] args){
        ArrayListTest poly = new ArrayListTest();
    }
}

此程序的目的是提示用户输入一组点(在坐标平面上),然后绘制连接这些点的线,创建不规则多边形。
基于所讨论的内容,当循环遍历所有其他元素并且剩下空白空间时,认为错误被触发。

这会导致程序从不存在的对象中提取对象,因此发生IndexOutOfBoundsException(我认为)。

2 个答案:

答案 0 :(得分:1)

这些代码行很有意思:

int i = 1; 
//loop triggers no errors, and does execute when running
while(iter.hasNext()){
    x = myPolygon.get(i).getX();
    y = myPolygon.get(i).getY();
    pen.move(x, y);
    i++;
}

您正在使用1初始化i并在get()方法中使用它。这里的问题是,列表myPolygon中的indice范围是从0size() - 1,但您使用的范围是1到{{1 }}。这可能会导致size()

接下来的事情是,你正在尝试使用IndexOutOfBoundsException,但你并没有真正使用它,因为你永远不会调用Iterator来获取下一个元素。这会导致另一个问题,因为iter.next()始终指向第一个元素,iter.hasNext()是一个inifite循环。这会导致while(iter.hasNext())超过i的大小,这会导致您的异常。使用myPolygon移动光标。

现在你可以使用它:

iter.next()

或(删除“旧”while(iter.hasNext()) { Point2D.Double polygon = iter.next(); x = polygon.getX(); y = polygon.getY(); pen.move(x, y); } 变量):

i

或者:

for (int i = 0; i < myPolygon.size(); i++) {
    x = myPolygon.get(i).getX();
    y = myPolygon.get(i).getY();
    pen.move(x, y);
}

答案 1 :(得分:0)

myPolygon.get(0)会抛出IndexOutOfBoundsException,因为当列表中没有任何元素时,您尝试访问列表中的元素。

你的循环工作正常,因为它甚至没有输入。

您可以通过在尝试进行任何绘图之前检查列表中是否有任何元素来避免这种情况。