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

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;
}

09-12 00:48