如何修复此运行时错误: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);
}