Java GUI中使用GeneralPath与Math类创建多边图形报错求助
问题解决:Java GUI 多边形绘制数组越界异常
报错原因
ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0的核心问题是数组初始化时机错误:
Neck类的成员变量ne默认初始值为0,在构造函数中创建px、py数组时,用的是这个默认值,导致数组长度为0。- 后续调用
seiten(int ne)设置边数时,仅修改了ne的值,但没有重新初始化数组,数组长度依然是0。调用genneck()访问px[0]时自然触发越界异常。
修复方案
方案1:构造函数直接传入边数(推荐)
把边数ne作为构造函数参数,初始化对象时直接设置,确保数组长度与边数匹配:
public Neck(int x, int y, int r, int ne) { super(x,y); this.r = r; this.ne = ne; px = new double[ne]; py = new double[ne]; }
方案2:动态修改边数时重新初始化数组
如果业务需要动态调整边数,在seiten方法中设置ne的同时,重新创建数组:
public void seiten(int ne) { this.ne = ne; // 重新初始化数组,长度匹配新的边数 px = new double[ne]; py = new double[ne]; }
额外优化:修正图形绘制的数学逻辑
原代码中x、y坐标计算都使用Math.sin,会导致多边形变形,应该用cos计算x轴偏移,sin计算y轴偏移,同时用360.0避免整数除法丢失精度:
double angle = Math.toRadians(i * 360.0 / ne); px[i] = x + (r * Math.cos(angle)); py[i] = y - (r * Math.sin(angle));
完整修复代码
import javax.swing.*; import java.awt.Shape; import java.awt.geom.GeneralPath; public class Neck extends Form { int r; private int ne; private double[] px, py; // 构造函数直接接收边数参数 public Neck(int x, int y, int r, int ne) { super(x, y); this.r = r; this.ne = ne; px = new double[ne]; py = new double[ne]; } // 支持动态修改边数 public void seiten(int ne) { this.ne = ne; px = new double[ne]; py = new double[ne]; } public Shape genneck() { for (int i = 0; i < ne; i++) { double angle = Math.toRadians(i * 360.0 / ne); px[i] = x + (r * Math.cos(angle)); py[i] = y - (r * Math.sin(angle)); } GeneralPath path = new GeneralPath(GeneralPath.WIND_NON_ZERO); path.moveTo(px[0], py[0]); for (int i = 1; i < ne; i++) { path.lineTo(px[i], py[i]); } path.closePath(); return path; } }
内容的提问来源于stack exchange,提问作者Giga
相关产品推荐
相关产品推荐

