Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何修复此运行时错误:java.lang.IndexOutOfBoundsException_Java_Arraylist - Fatal编程技术网

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

如何修复此运行时错误:java.lang.IndexOutOfBoundsException,java,arraylist,Java,Arraylist,这是我的密码。它编译时没有错误。执行时,运行时错误为 java.lang.IndexOutOfBoundsException at java.util.ArrayList.rangeCheck(Unknown Source) at java.util.ArrayList.get(Unknown Source) 对有问题的行进行了评论。我不确定出了什么问题,但我对数组列表是新手 import java.awt.geom.*; import java.util.Iterator; impo

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

java.lang.IndexOutOfBoundsException
  at java.util.ArrayList.rangeCheck(Unknown Source)
  at java.util.ArrayList.get(Unknown Source)
对有问题的行进行了评论。我不确定出了什么问题,但我对
数组列表是新手

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();
    }
}
导入java.awt.geom.*;
导入java.util.Iterator;
导入java.util.ArrayList;
导入java.util.Scanner;
导入gpdraw.*;
公共类ArrayListTest{
私有ArrayList myPolygon=
新ArrayList(20);
专用扫描仪扫描=新扫描仪(System.in);
公共ArrayListTest(){
过程();
draw();
}
私有无效进程(){
双x,y;
System.out.println(“输入一组坐标点,这些坐标点将”
+“用于创建不规则多边形。”);
System.out.println(“使用此格式:xy”
+“\n输入911以绘制多边形。”);
而(1>0){
System.out.print(“输入点:”);
x=scan.nextDouble();
如果(x==911){break;}
否则{
y=扫描.nextDouble();
Point2D.Double pt=新的Point2D.Double(x,y);
addPt(pt);}
}
}
}
公共void addPt(Point2D.Double pt){
myPolygon.add(pt);
}
公众抽签(){
画板纸=新画板(400400);
绘图工具笔=新绘图工具(纸);
迭代器iter=myPolygon.Iterator();
pen.up();
double x=myPolygon.get(0.getX();
double y=myPolygon.get(0.getY();
笔移动(x,y);
pen.down();
int i=1;
while(iter.hasNext()){
x=myPolygon.get(i).getX();//错误实际上在这一行,
y=myPolygon.get(i).getY();
笔移动(x,y);
i++;
}
move(myPolygon.get(0.getX(),myPolygon.get(0.getY());
}
公共静态void main(字符串[]args){
ArrayListTest poly=新的ArrayListTest();
}
}
此程序的目的是提示用户输入一组点(在坐标平面上),然后绘制连接这些点的线,创建不规则多边形
根据所讨论的内容,当循环通过所有其他元素并留下空白时,错误被认为是触发的

这会导致程序从不存在的对象中提取对象,因此会出现
indexoutboundsexception

myPolygon.get(0)
抛出一个
indexoutboundsexception
,因为当列表中没有任何元素时,您试图从列表中访问元素

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


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

这些代码行很有趣:

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
中的标记范围是从
0
size()。这可能导致出现
索引自动边界异常

下一件事是,您试图使用
迭代器,但实际上并没有使用它,因为您从未调用
iter.next()
来获取下一个元素。这会导致另一个问题,因为
iter.hasNext()
始终指向第一个元素,而
(iter.hasNext())
是一个inifite循环。这会导致
i
超过
myPolygon
的大小,从而导致异常。使用
iter.next()
移动光标

现在,您可以使用以下选项之一:

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


您是否立即输入
911
?不。您应该先输入一些点。如果您先输入一些点,则
myPolygon.get(0.getX())上不会出现错误//在这一行触发错误
。哦,你说得对。然后错误与
x=myPolygon.get(i).getX()相关联那么,这是否意味着程序试图检索不存在的元素?我建议您使用此信息更新问题,因为当前信息将引导人们走向错误的方向。
myPolygon.get(0)
位于
draw()下
方法,在通过用户输入将
ArrayList
添加到后执行。此外,循环被输入,尝试输入一些点,将绘制线。显然不是。此外,如果是这样的话,那么添加支票也不会有什么坏处。您建议我如何创建支票?
如果(!myPolygon.isEmpty())
。。。不过没关系,既然你已经更新了错误实际发生的位置,我的答案就不再相关了。不过支票还是不错的。谢谢你的帮助!这解决了问题。
for (int i = 0; i < myPolygon.size(); i++) {
    x = myPolygon.get(i).getX();
    y = myPolygon.get(i).getY();
    pen.move(x, y);
}
for (Point2D.Double point : myPolygon) {
    x = point.getX();
    y = point.getY();
    pen.move(x, y);
}