【问题标题】:Expecting PreconditionError but got NullPointerException期待 PreconditionError 但得到 NullPointerException
【发布时间】:2018-03-04 12:10:58
【问题描述】:

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

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。

【问题讨论】:

    标签: java illegalargumentexception contract


    【解决方案1】:

    Cofoja 页面所述:

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

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

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

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

    【讨论】:

    • 我不允许更改构造函数内的任何代码
    猜你喜欢
    • 2021-08-15
    • 2022-12-22
    • 2020-11-09
    • 2022-01-04
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    相关资源
    最近更新 更多