期待PreconditionError但得到了NullPointerException

问题描述 投票:0回答:1

我在构造函数方法之前有一个带有前置条件的类(注意要求)。

public class Natural {
private int data;

@Requires("n != null")
public Natural(Natural n) {
    this(n.data);
 }
}

这是对前提条件的测试。它测试构造函数的null输入。

@Test(expected = PreconditionError.class)
public void testConstructorWrong2() {
    Natural n = new Natural(null);
}

测试应该通过,因为此测试期望违反Precondition。但我得到的是NullPonterException。

java illegalargumentexception contract
1个回答
1
投票

Cofoja页面所述:

但是,一个非常重要的区别是在调用父构造函数之后检查构造函数前提条件。这是因为超级调用必然是任何构造函数调用的第一条指令,因此无法在它们之前插入前置条件检查。 (这被认为是一个已知的错误。

以上可能适用于this以及super。只有在调用@Requires之后才能检查this(n.data);条件,因为Java不允许任何事情发生在它之前。所以,在注释之前,对n.data的调用会引发一个NullPointerException甚至有机会检查前提条件。

如果您仍想检查前置条件,则必须删除对this(...)的调用并直接初始化对象

@Requires("n != null")
public Natural(Natural n) {
  this.data = n.data;
}
© www.soinside.com 2019 - 2024. All rights reserved.