IntelliJ IDEA报告合同违规警告

这里是Java代码:

public static boolean anyEqual(Object needle, Object... haystack) {
    if(needle == null || haystack == null) {
        return false;
    }
    if(haystack.length == 0) {
        return false;
    }
    for(Object match : haystack) {
        if(match != null && needle.getClass() == match.getClass() && needle.equals(match)) {
            return true; // warning from IntelliJ here, 'contract clause !null, null -> false is violated'
        }
    }
    return false;
}

有没有人知道为什么会显示? contract clause !null, null -> false is violated吗? 谢谢!

IntelliJ 14.0.2 build:139.659

截图: 在这里输入图像描述


IntelliJ推断你的方法的正式合同是这样的:

null, _ -> false; !null, null -> false

这实际上意味着什么:

  • 第一个合约规定,只要第一个参数为null ,它将返回false 。 这是你的第一条if语句所观察到的:

    if(needle == null || haystack == null) {
        return false;
    }
    
  • 第二个合约规定,如果第二个参数为null ,那么它将返回false 。 这也由上述相同的if语句指定。

  • 我的直觉告诉我,除了上述所有内容之外,IntelliJ在辨别循环的正式合同方面遇到了一些麻烦,尽管它与合同表达中的另一个条件一样简单。

    for(Object match : haystack) {
        if(match != null && needle.getClass() == match.getClass() && needle.equals(match)) {
            return true;
        }
    }
    

    让我们简单介绍一下。

  • 如果haystack长度为0,则增强型for语句不会触发,因此需要考虑这一点。
  • 数组内部的元素可能为null ,我不完全确定IntelliJ的静态分析是否涵盖了这一块。
  • 我们已经确定, needle必须是非空的,所以没有任何违反该线的合同。
  • 如果我们有match != null && needle.getClass() == match.getClass() && needle.equals(match)true match != null && needle.getClass() == match.getClass() && needle.equals(match) ,我们返回true 。 否则,我们返回false
  • 在正式文档中没有任何东西可以让我们看到我们需要说的表达式,“嘿,我们正在检查数组的元素! 可能会出现这样的情况,即尽管我们在上面陈述过(因为haystack非空),我们仍然返回true ,所以分析正在取消。

    请允许我强调这一点:

    haystack必须非null ,才能进入增强型。 否则您的代码将无法工作。

    总而言之,我不会为此担心。 更好的是,提交一个对它的错误,以便这样的事情可以被固定或扩展。


    这看起来像一个IntelliJ错误,因为通过从方法中删除static关键字,警告消失。

    有些东西一定会让这里的静态分析产生混淆。 人们总是可以将它提交给你,以便jetbrains开发者可以查看它。

    有人已经在这里报告了这个问题

    (在v14.0.3上测试)


    此消息正在显示,因为IntelliJ检查方法合同违规。 这是一个相对较新的功能,请阅读https://www.jetbrains.com/idea/features/annotation_java.html

    链接地址: http://www.djcxy.com/p/24971.html

    上一篇: IntelliJ IDEA Reporting Contract Violation Warning

    下一篇: Specify Font type on R Markdown