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

向ArrayList添加图形时触发NullPointerException问题求助

解决绘图程序添加图形时的NullPointerException问题

1. 核心问题:成员变量未初始化导致空指针

你的ShapeCollection构造函数里犯了一个常见错误——重新定义了局部变量,没有给类的成员变量赋值。构造函数里的ArrayList<Line> lines = new ArrayList<>();是创建了一个局部的lines列表,而类里声明的private ArrayList<Line> lines;成员变量依然是null。调用addShape时自然会触发空指针异常。

修复后的ShapeCollection代码:

public class ShapeCollection {
    private ArrayList<Line> lines;
    private ArrayList<Rectangle> rectangles;
    private ArrayList<Ellipse> ellipses;
    
    public ShapeCollection() {
        // 直接给成员变量初始化,不要重新定义局部变量
        lines = new ArrayList<Line>();
        rectangles = new ArrayList<Rectangle>();
        ellipses = new ArrayList<Ellipse>();
    }
    
    public void addShape(Shape shape) {
        if (shape instanceof Line) {
            lines.add((Line) shape);
        } else if (shape instanceof Rectangle) { // 用else if更高效
            rectangles.add((Rectangle) shape);
        } else if (shape instanceof Ellipse) {
            ellipses.add((Ellipse) shape);
        }
    }
}

2. GUI代码的潜在问题优化

(1)字符串比较不要用==

Java中字符串比较内容要用equals(),==比较的是对象引用。把shapesCombo.getValue() == "Line"改成"Line".equals(shapesCombo.getValue()),避免因为字符串对象不同导致判断失效。

(2)避免重复绑定鼠标事件

当前代码每次选中drawButt且选择Line时,都会给pane绑定一次鼠标事件。多次操作后,同一个鼠标事件会触发多次逻辑,可能导致重复添加图形到collector里。建议调整逻辑:

优化后的GUI代码片段:

if (drawButt.isSelected() && "Line".equals(shapesCombo.getValue())) {
    // 先移除之前可能存在的事件,避免重复绑定
    pane.setOnMousePressed(null);
    pane.setOnMouseDragged(null);
    pane.setOnMouseReleased(null);
    
    pane.setOnMousePressed(m -> {
        Line line = new Line();
        line.setStroke(currentColor.getFill());
        line.setStartX(m.getSceneX());
        line.setStartY(m.getSceneY());
        pane.getChildren().add(line);
        
        pane.setOnMouseDragged(q -> {
            line.setEndX(q.getSceneX());
            line.setEndY(q.getSceneY());
        });
        
        pane.setOnMouseReleased(a -> {
            collector.addShape(line);
            // 释放后解绑拖拽和释放事件,避免后续干扰
            pane.setOnMouseDragged(null);
            pane.setOnMouseReleased(null);
        });
    });
}

3. 测试验证

修复后,绘制线条时collector.addShape(line)就能正常把线条添加到lines列表里,不会再触发空指针异常。如果还有其他图形(矩形、椭圆)的绘制逻辑,同样要检查对应的事件绑定和类型判断是否正确。

内容的提问来源于stack exchange,提问作者HatCode03

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 22:22:25