IntelliJ IDEA 报契约违背警告
IntelliJ IDEA Reporting Contract Violation Warning
这是 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
截图:
显示此消息是因为 IntelliJ 检查方法约定违规。这是一项相对较新的功能,请在 https://www.jetbrains.com/idea/features/annotation_java.html
阅读更多内容
IntelliJ 正在推断您方法的正式 contract 是这样的:
null, _ -> false; !null, null -> false
这实际上意味着什么:
第一个合约规定,只要第一个参数是null
,就会returnfalse
。这是由您的第一个 if
语句观察到的:
if(needle == null || haystack == null) {
return false;
}
第二个合约规定,如果第二个参数是null
,那么它将returnfalse
。这也由上面相同的 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
的场景,我们 return true
。否则,我们 return false
.
有 nothing that I can see in the formal documentation 给了我们需要说的表达式,"hey - we're checking elements of an array!";尽管我们上面说过,但分析可能会因为我们 returning true
这一事实而失败(因为 haystack
是非空的)。
请允许我强调这一点:
haystack
必须是非 null
才能让您进入增强型。 否则您的代码将无法工作。
总而言之,我不会担心。更好的是,针对它提交错误,以便可以修复或扩展此类问题。
对我来说这看起来像是一个 IntelliJ 错误,因为通过从方法中删除 static
关键字,警告就会消失。
一定有什么东西混淆了这里的静态分析。人们可以随时将其提交给 youtrack,以便 jetbrains 开发人员可以查看它。
已经有人报告了这个问题Here
(在 v14.0.3 上测试)
这是 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
截图:
显示此消息是因为 IntelliJ 检查方法约定违规。这是一项相对较新的功能,请在 https://www.jetbrains.com/idea/features/annotation_java.html
阅读更多内容IntelliJ 正在推断您方法的正式 contract 是这样的:
null, _ -> false; !null, null -> false
这实际上意味着什么:
第一个合约规定,只要第一个参数是
null
,就会returnfalse
。这是由您的第一个if
语句观察到的:if(needle == null || haystack == null) { return false; }
第二个合约规定,如果第二个参数是
null
,那么它将returnfalse
。这也由上面相同的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
的场景,我们 returntrue
。否则,我们 returnfalse
.
有 nothing that I can see in the formal documentation 给了我们需要说的表达式,"hey - we're checking elements of an array!";尽管我们上面说过,但分析可能会因为我们 returning true
这一事实而失败(因为 haystack
是非空的)。
请允许我强调这一点:
haystack
必须是非 null
才能让您进入增强型。 否则您的代码将无法工作。
总而言之,我不会担心。更好的是,针对它提交错误,以便可以修复或扩展此类问题。
对我来说这看起来像是一个 IntelliJ 错误,因为通过从方法中删除 static
关键字,警告就会消失。
一定有什么东西混淆了这里的静态分析。人们可以随时将其提交给 youtrack,以便 jetbrains 开发人员可以查看它。
已经有人报告了这个问题Here
(在 v14.0.3 上测试)