java - Idea Intellij拆箱警告似乎不是基于数据流分析

标签 java intellij-idea iteration compiler-warnings dataflow

关于拆箱引起的 NullPointerException 有多个问题,特别是在从 Integer 对象执行诸如 int k = ... 之类的操作时。我理解这个问题。我的问题是关于数据流分析的:

当我执行以下操作时,会出现黄色波浪线:

HashBiMap<String, Integer> myMap = ... ; // some method populates a Guava HashBiMap
for (String s : myMap.keySet()) {
    int i = myMap.get(s); // Intellij issues warning here about NullPointerException
}

该警告表示,根据数据流分析,Intellij 认为运行时可能会抛出 NullPointerException。然而,当我将上面的代码更改为如下迭代时,警告就会消失:

for (Map.Entry<String, Integer> entry : myMap.entrySet()) {
    String s = entry.getKey();
    int i = entry.getValue(); 
}

据我所知,两次迭代都有相同的数据流,并且都不应该发出任何警告(或者两者都应该发出相同的警告)。两种迭代 map 方式的数据流有什么区别(如果有的话)?

最佳答案

As far as I can see, both iterations have the same data flow and neither should issue any warning. What, if any, is the difference in the data flows of the two ways of iterating over a map?

我认为区别在于,entrySet() 上的迭代器被假定(通过 DFA、注释或明确地)仅返回完整条目,即值为绝不null。迭代 keySet() 并分别取出值有点不同。考虑一个并发映射:可以在检索键之后、调用 get() 之前删除该值。

不过,这种假设在您的情况下似乎并不成立,因为 HashBiMap 的文档表明 null 键和值都受支持。

关于java - Idea Intellij拆箱警告似乎不是基于数据流分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21489931/

相关文章:

java - 如何将 boolean 变量作为 ModelAttribute 对象的字段发送到服务器端?

android - 我无法安装/启动适用于 Windows 7 64 位的 Android Studio

java.security.NoSuchAlgorithmException : Cannot find any provider supporting RSA/NONE/PKCS1Padding in jar-file

vba - 如何迭代多个 Word 实例(使用 AccessibleObjectFromWindow)

java - 显示标签Struts 2导出不显示PDF

java - Spring Hibernate持久化异常分离实体

java - Spring - RestTemplate 调用 https rest 服务时出错(证书错误)

node.js - 如何安装 NodeJs IntelliJ CE 插件?

python - 在 Python 中检索特定的集合元素

c++ - 计算特定区间内的点数