当我尝试从普通数组中检索对象时,我遇到了一个空指针异常。首先,我用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());
//}
}
}
}
}
答案 0 :(得分: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
条件试图达到的目标。)
最好使用List<Line>
代替。然后在paint
中你可以使用:
for (Line line : lines) {
...
}
...在mouseReleased
你只需要使用:
lines.add(new Line(...));
另请注意,Line
没有理由成为内部类。使其成为静态嵌套类或顶级(非嵌套)类。
答案 1 :(得分:0)
您是否检查过该行是否确实添加到mouseReleased
?
答案 2 :(得分:0)
问题是你只在mouseReleased()
函数中填充数组,而paint
方法不等待鼠标释放。因此,当鼠标未释放时,paint()
方法会尝试绘制线条。
您只需取消注释if(lines[lineCounter]!=null)
,然后尝试即可。
如果您想取得其他成就,请告诉我们