gpt4 book ai didi

java - IntelliJ IDEA 报契约违背警告

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:32:16 24 4
gpt4 key购买 nike

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 构建:139.659

屏幕截图:enter image description here

最佳答案

IntelliJ 正在推断正式的 contract你的方法是这样的:

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

这实际上意味着什么:

  • 第一个合约规定,只要第一个参数为null,就会返回false。这是通过您的第一个 if 语句观察到的:

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

我的直觉告诉我,除了上述所有内容之外,IntelliJ 在辨别循环的正式契约(Contract)是什么方面遇到了一些麻烦,尽管它就像契约(Contract)表达式中的另一个条件一样简单。

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

让我们简要介绍一下。

  • 如果 haystack 的长度为 0,则不会触发增强型 for 语句,因此需要考虑这一点。
  • 数组中的元素可以是null,我不确定 IntelliJ 的静态分析是否涵盖了这一部分。
  • 我们已经确定 needle 必须是非空的,所以在那条线上没有任何违反契约(Contract)的事情。
  • 如果我们有一个场景,其中 match != null && needle.getClass() == match.getClass() && needle.equals(match)true ,我们返回 true。否则,我们返回 false

nothing that I can see in the formal documentation这给了我们我们需要说的表达式,“嘿 - 我们正在检查数组的元素!”;可能是因为我们返回 true 这一事实导致分析出错,尽管我们上面已经声明了(因为 haystack 是非空的)。

请允许我强调这一点:

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

总而言之,我不会担心。更好的是,针对它提交错误,以便可以修复或扩展此类问题。

关于java - IntelliJ IDEA 报契约违背警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28485085/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com