IntelliJ IDEA 14为何对部分NPE场景未给出警告?
这其实是IntelliJ IDEA 14版本静态代码分析的一个典型行为,核心在于它如何解读你代码里的null检查逻辑:
当你写了
if (v == null) {}这个空判断时,IDE会理解成你自己已经明确意识到变量v可能为null。但你在这个判断之后,既没有在null分支里处理风险(比如return或者给v赋默认值),又直接调用v.toUpperCase(),这时候IDE就会触发警告——毕竟你都承认了null的可能性,却没做任何防护,这明显是个潜在的坑。而当你把这个if语句删掉后,IDE的静态分析就不会主动去标记
map.get("key")的返回值为“可能为null”。在IDEA 14这个早期版本里,对于Map.get()这类方法,默认不会强制推断返回值的null风险(除非你给方法加了@Nullable注解,或者手动开启了更严格的分析规则)。它会默认假设你作为开发者,清楚这个方法可能返回null,但如果你没显式做检查,就代表你自己能把控这个风险(比如你确定这个key一定存在于map中),所以不会主动弹出警告。
说白了,IDEA 14的这个警告逻辑是跟着你的代码暗示走的:你写了null检查,等于告诉IDE“这个变量可能空”,那后续的不安全调用就会被揪出来;如果没写检查,它不会主动替你预设这个风险,自然也就不会警告。
顺带提一句,这个逻辑在后续的IDEA版本里已经优化了——新版本会更智能地推断Map.get()的返回值可能为null,哪怕你没写显式的null检查,也会给出NPE风险的提示。
内容的提问来源于stack exchange,提问作者DodgyCodeException

