You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 11:10:10