-2

当我尝试从普通数组中检索对象时遇到空指针异常。首先我用 10 个对象初始化数组,Line然后设置数组中每个对象的值。但是当我检索任何对象的值时,我发现它是 0。为什么会这样?

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;

public class LineArrayLimt extends Applet
    implements MouseListener, MouseMotionListener {

    int width, height;
    int x, y, lineCounter;    // the coordinates of the upper-left corner of the box
    int mx, my;  // the most recently recorded mouse coordinates
    int new_mx;
    int new_my;
    Thread th;
    boolean isMouseDragging = false, isStored;
    Line[] lines = new Line[10];

    class Line {

        Line() {
        }

        Line(int x1, int y1, int x2, int y2) {
            this.x1 = x1;
            this.y1 = y1;
            this.x2 = x2;
            this.y2 = y2;
        }
        private int x1, y1, x2, y2;

        public void setX1(int x) {
            this.x1 = x;
        }

        public void setY1(int y) {
            this.y1 = y;
        }

        public void setX2(int x) {
            this.x2 = x;
        }

        public void setY2(int y) {
            this.y2 = y;
        }

        public int getX1() {
            return x1;
        }

        public int getY1() {
            return y1;
        }

        public int getX2() {
            return x2;
        }

        public int getY2() {
            return y2;
        }
    }

    public void init() {
        width = getSize().width;
        height = getSize().height;
        setBackground(Color.black);
        addMouseListener(this);
        addMouseMotionListener(this);
        for (int i = 0; i < lines.length; i++) {
            lines[i] = new Line();
        }

    }

    public void mouseEntered(MouseEvent e) {
    }

    public void mouseExited(MouseEvent e) {
    }

    public void mouseClicked(MouseEvent e) {
    }

    public void mousePressed(MouseEvent e) {
        System.out.println("-----------------Mouse Pressed------------------------");
        mx = e.getX();
        my = e.getY();



    }

    public void mouseReleased(MouseEvent e) {
        System.out.println("-----------------Mouse Released------------------------");
        if (isMouseDragging) {
            if (lineCounter != lines.length - 1) {
                lines[lineCounter].setX1(mx);
                lines[lineCounter].setY1(my);
                lines[lineCounter].setX2(new_mx);
                lines[lineCounter].setY2(new_my);
                lineCounter++;
                if (lines[lineCounter] != null) {
                    System.out.println("-----------------First Object------------------------" + lines[lineCounter].getX1() + " " + lines[lineCounter].getY1() + " " + lines[lineCounter].getX2() + " " + lines[lineCounter].getY1());
                }


            }

        }
        isMouseDragging = false;

    }

    public void mouseMoved(MouseEvent e) {
    }

    public void mouseDragged(MouseEvent e) {
        System.out.println("-----------------Mouse Dragged------------------------");
        isMouseDragging = true;
        new_mx = e.getX();
        new_my = e.getY();
        if (new_mx <= 35) {
            new_mx = 35;
        }
        if (new_mx > width - 40) {
            new_mx = width - 40;
        }
        if (new_my > height - 40) {
            new_my = height - 40;
        }
        if (new_my < 35) {
            new_my = 35;
        }
        repaint();

    }

    public void paint(Graphics g) {
        System.out.println("-----------------Line No." + lineCounter + " is inside paint------------------------");
        g.setColor(Color.RED);
        if (isMouseDragging) {
            System.out.println("-----------------Paint while dragging------------------------");
            g.drawLine(mx, my, new_mx, new_my);
            if (lineCounter != lines.length - 1) {
                //if(lines[lineCounter]!=null){
                g.drawLine(lines[lineCounter].getX1(), lines[lineCounter].getY1(), lines[lineCounter].getX2(), lines[lineCounter].getX2());
                System.out.println("*************" + lines[lineCounter].getX1() + lines[lineCounter].getY1() + lines[lineCounter].getX2() + lines[lineCounter].getX2());
                //}
            }
        }
    }
}
4

3 回答 3

2

问题在于,在 init 中,您正在初始化lines一个包含 10 个空引用的数组:

lines = new Line[10];

然后在paint你使用那个空引用:

if (lineCounter != lines.length - 1) {
    g.drawLine(lines[lineCounter].getX1(),
               lines[lineCounter].getY1(),
               lines[lineCounter].getX2(),
               lines[lineCounter].getY2());
}

lines.length始终为 10 - 它不是数组中非空引用的数量。这不是你添加的行数,或者类似的东西。if(老实说,目前尚不清楚您的病情要达到什么目的。)

你最好使用 aList<Line>代替。然后paint你可以使用:

for (Line line : lines) {
    ...
}

...并且mouseReleased您只需使用:

lines.add(new Line(...));

另请注意,没有理由Line成为内部类。要么使其成为静态嵌套类,要么使其成为顶级(非嵌套)类。

于 2012-12-28T09:18:29.260 回答
0

您是否检查过该行是否确实已添加到数组中mouseReleased

于 2012-12-28T09:17:45.407 回答
0

问题是您仅在mouseReleased()函数中填充数组,并且paint方法不等待鼠标释放。所以当鼠标没有被释放时,paint()方法会尝试画线。

您只需取消注释您的检查if(lines[lineCounter]!=null)并尝试,它应该可以工作。

如果您想实现其他目标,请告诉我们

于 2012-12-28T09:29:08.530 回答