Java 为什么我要通过创建一个子类得到一个NullPointerException;“正方形”;它扩展了一个抽象类;“图”是什么;?
我创建了一个名为“Figure”的抽象类,它有一个子类“Square” 然后我创建了一个测试Java 为什么我要通过创建一个子类得到一个NullPointerException;“正方形”;它扩展了一个抽象类;“图”是什么;?,java,Java,我创建了一个名为“Figure”的抽象类,它有一个子类“Square” 然后我创建了一个测试 class FigureTest { Figure figure; Square square; @BeforeEach void setup() { square = figure.new Square(3, 4, 5); //this causes a NullPointerException } } 但是我得到了一个NullPointerException,我不知道为什么。我该怎么办
class FigureTest {
Figure figure;
Square square;
@BeforeEach
void setup() {
square = figure.new Square(3, 4, 5); //this causes a NullPointerException
}
}
但是我得到了一个NullPointerException,我不知道为什么。我该怎么办?您调用
图形。新的但图形当时未初始化。因此,您可以有效地调用null.new
,它无法工作,因为null没有这样的运算符。首先,您必须为figure指定一个对象实例,然后才能使用它
但正如user85421所写,真正的问题可能是奇怪的嵌套。我看没有理由这么做。你应该修正压痕,这样错误就会更明显
如果Square
在Figure
之外,那么您可以编写
square = new Square(3, 4, 5)
不会产生异常。您调用figure。新的
但此时未初始化figure。因此,您可以有效地调用null.new
,它无法工作,因为null没有这样的运算符。首先,您必须为figure指定一个对象实例,然后才能使用它
但正如user85421所写,真正的问题可能是奇怪的嵌套。我看没有理由这么做。你应该修正压痕,这样错误就会更明显
如果Square
在Figure
之外,那么您可以编写
square = new Square(3, 4, 5)
这不会产生异常。好的,首先,您的代码通常是不正确的。虽然Square是Figure的子类/子类,但它永远不能用于实例化Figure类。这是因为Square是Figure类的嵌套内部类,要实例化内部类,必须首先实例化外部类。然后,使用以下语法在外部对象中创建内部对象:
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
但是在您的例子中实例化外部类是不可能的,因为它是抽象类(只能用其子类的构造函数实例化)。这里我想指出的另一件事是,在一个java文件中,您只能有一个公共类,其余的类都有defaultaccess修饰符
现在来看上述代码的正确语法,它可能看起来像这样:
public abstract class Figure {
public abstract float area();
}
class Square extends Figure {
private float x, y, l;
public Square (float x, float y, float l) {
this.x = x;
this.y = y;
this.l = l;
}
@Override
public float area() {
return l*l;
}
}
现在,您可以轻松地实例化Figure类,如下所示:
class FigureTest {
Figure figure;
@BeforeEach
void setup() {
figure= new Square(3, 4, 5);
}
}
好的,首先你的代码通常是不正确的。虽然Square是Figure的子类/子类,但它永远不能用于实例化Figure类。这是因为Square是Figure类的嵌套内部类,要实例化内部类,必须首先实例化外部类。然后,使用以下语法在外部对象中创建内部对象:
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
但是在您的例子中实例化外部类是不可能的,因为它是抽象类(只能用其子类的构造函数实例化)。这里我想指出的另一件事是,在一个java文件中,您只能有一个公共类,其余的类都有defaultaccess修饰符
现在来看上述代码的正确语法,它可能看起来像这样:
public abstract class Figure {
public abstract float area();
}
class Square extends Figure {
private float x, y, l;
public Square (float x, float y, float l) {
this.x = x;
this.y = y;
this.l = l;
}
@Override
public float area() {
return l*l;
}
}
现在,您可以轻松地实例化Figure类,如下所示:
class FigureTest {
Figure figure;
@BeforeEach
void setup() {
figure= new Square(3, 4, 5);
}
}
Square
是FIgure
的一个嵌套类,而不仅仅是一个子类-非常奇怪的构造,可能是错误的-因此它需要一个您没有创建的FIgure
实例-我建议将该类移动到自己的文件中,或者至少使其保持静态。我是否应该创建一个单独的类“Square”,它位于“FIgure”之外而不是在“Figure”中?因为Figure
是抽象的
//请参见上面编辑的注释,所以错误是嵌套类?将“正方形”作为嵌套的“图形”类没有意义?我必须创建一个单独的类“Square”,它扩展了“Figure”?确切地说(根据类名的含义)-有时使用嵌套类是正确的,这意味着内部类是外部类的一部分(内部需要一个外部类(除非标记为static
)Square
是FIgure
的一个嵌套类,而不仅仅是一个子类-非常奇怪的构造,可能是错误的-因此它需要一个您没有创建的FIgure
实例-我建议将该类移动到自己的文件中,或者至少使其保持静态。我是否应该创建一个单独的类“Square”,它位于“FIgure”之外而不是在“Figure”中?因为Figure
是抽象的
//请参见上面编辑的注释,所以错误是嵌套类?将“正方形”作为嵌套的“图形”类没有意义?我必须创建一个单独的类“Square”,它扩展了“Figure”?确切地说(根据类名的含义)-有时使用嵌套类是正确的,这意味着内部类是外部类的一部分(内部需要一个外部类(除非标记为static
)