我在构造函数方法之前有一个带有前提条件的自然类(请注意要求)。
public class Natural {
private int data;
@Requires("n != null")
public Natural(Natural n) {
this(n.data);
}
}
这是对该前提条件的测试。它为空输入测试构造函数。
@Test(expected = PreconditionError.class)
public void testConstructorWrong2() {
Natural n = new Natural(null);
}
该测试应该通过,因为该测试预期会违反前提条件。但是我却得到了NullPonterException。
最佳答案
如Cofoja页上所述:
但是,一个非常重要的区别是,在对父构造函数的任何调用之后都会检查构造函数的前提条件。这是因为超级调用必然是任何构造函数调用的第一条指令,因此无法在其之前插入先决条件检查。 (这被认为是已知的错误。
上面的内容可能适用于this
以及super
。只能在调用@Requires
之后检查this(n.data);
条件,因为Java不允许在此之前出现任何内容。因此,对n.data
的调用在注释甚至有机会检查先决条件之前就引发了NullPointerException
。
如果仍要检查前提条件,则必须删除对this(...)
的调用并直接初始化对象
@Requires("n != null")
public Natural(Natural n) {
this.data = n.data;
}