关于拆箱引起的 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/