我试图简单地在Java中扩展一个抽象类并调用存储在其中的一些方法。我这样做时不断收到NullPointerException。我在这里错过了关于抽象的东西吗?
这是父类:
public abstract class Shape {
public Color color;
public Point center;
public double rotation;
public Shape() {
Color color = new Color();
Point center = new Point();
rotation = 0.0;
System.out.println("shape created");
}
public void setLocation( Point p ) { center.locationX = p.locationX; center.locationY = p.locationY; }
public void setLocation( double x, double y ) { center.locationX = x; center.locationY = y; }
public abstract double calcArea();
public abstract boolean draw();
}
孩子班:
public class Ellipse extends Shape {
public Ellipse() {
}
public double calcArea() {
return 0.0;
}
public boolean draw() {
return true;
}
}
您可能希望看到Point:
public class Point {
public double locationX;
public double locationY;
public Point() {
locationX = 0.0;
locationY = 0.0;
}
}
最后主要功能:
public class MakeShapes {
public static void main(String []args) {
Ellipse myShapes = new Ellipse();
myShapes.setLocation( 100.0, 100.0 );
}
}
一旦我使用setLocation(),我就会得到NPE。有什么想法吗?试图解决这个问题,我的大脑很痛。感谢!!!
答案 0 :(得分:8)
这里的问题是,您的Shape
构造函数会创建一个名为Point
的本地center
引用,并启动该引用而不是初始化该字段(并且{{1}存在同样的问题}})。试试这样:
color
答案 1 :(得分:4)
这是一个微妙的错误。您正在创建本地center
变量,而不是将其分配给this.center
public Shape() {
Color color = Color.BLACK;
Point center = new Point();
rotation = 0.0;
System.out.println("shape created");
}
将color
和center
声明更改为this.
this.center = new Point()
最后,this.center
从未实际定义过,因此也就是NPE。
答案 2 :(得分:0)
我同意上述内容。
您正在构造函数中创建另一个对象的实例,该对象在范围之外被删除。 所以,你实际上并没有设置对象的成员。