Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我要通过创建一个子类得到一个NullPointerException;“正方形”;它扩展了一个抽象类;“图”是什么;?_Java - Fatal编程技术网

Java 为什么我要通过创建一个子类得到一个NullPointerException;“正方形”;它扩展了一个抽象类;“图”是什么;?

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,我不知道为什么。我该怎么办

我创建了一个名为“Figure”的抽象类,它有一个子类“Square”

然后我创建了一个测试

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