向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
相关产品推荐
相关产品推荐

