【问题标题】:Eclipse gives dead code warning for reachable code (variant)Eclipse 为可访问代码(变体)提供死代码警告
【发布时间】:2018-10-15 10:08:52
【问题描述】:

我有以下代码:

public String myMethod(String keyValue) {
    Map<String, Integer> keyValueToRowIndex = ...
    Integer rowIndex = (keyValue == null) ? 0 : keyValueToRowIndex.get(keyValue);
    if (rowIndex == null)
      return null;
    ...
}

Eclipse 在return null; 上给出“死代码”警告。删除 keyValue == null 的测试也会删除警告,但我看不出额外的测试如何使 return 语句成为死代码。显然,如果映射不包含某些非空 keyValue 的条目,那么 rowIndex 仍然可以为空。或者我在这里错过了什么?

我见过类似的 Eclipse 问题(例如here),但这个问题似乎不同且更微不足道。

【问题讨论】:

  • 您的 Java 版本是多少? Java 7 和 8 之间存在差异。stackoverflow.com/a/25417505/5168011
  • 我在 Java8 上使用过,但是 7 和 8 都存在警告。
  • 在这两种情况下都会引发 NPE(请参阅对已接受答案的评论)

标签: java eclipse dead-code


【解决方案1】:

(令人惊讶的)简短回答:Eclipse 是对的!这是死代码!

原因

重要的部分是下面这行代码中的三元表达式:

    Integer rowIndex = (keyValue == null) ? 0 : keyValueToRowIndex.get(keyValue);

Java language specification (JLS) 表示"Conditional Operator ?",如果第一个表达式的类型为int,而第二个表达式的类型为Integer,则整个表达式的类型将为int

在您的情况下,第一个表达式是常量文字值0,即int。第二个表达式是get 方法的结果,它返回一个Integer 类型的对象。所以根据 JLS,整个表达式有原始类型 int!

这意味着,如果将评估第二个表达式(get-call),则结果将从Integer 拆箱到int。然后,此 int 值将再次自动装箱到 Integer 中,以便能够将其分配给左侧操作数 rowIndex

但是,如果地图返回 null 值会发生什么?在这种情况下,无法从Integer 拆箱到int,并且会抛出NullPointerExpression

所以 eclipse 是对的,因为你的表达式永远不会返回 nullrowIndex 也永远不会是 null,而且你的 if 语句的 then 块永远不会被执行,因此是死代码!

解决方案

解决方案很简单:为您的第一个表达式使用Integer 对象而不是原始int 值:

Integer rowIndex = (keyValue == null) ? Integer.valueOf(0) : keyValueToRowIndex.get(keyValue);

【讨论】:

  • 谢谢,是的,这是完整的答案。我已经从@Gyro Gearless 的回答中推断出这一点,并接受了这一点。参考 +1。
【解决方案2】:

我的猜测是第 3 行被解释为

Integer rowIndex = Integer.valueOf((keyValue == null) ? 0 : keyValueToRowIndex.get(keyValue).intValue());

(所以 ?: 的两个参数都统一为int) - 奇怪的是,Eclipse 现在没有显示警告,即使现在很明显 rowIndex 永远不会为空......

您也可以将0 替换为Integer.valueOf(0) 以使警告消失。

【讨论】:

  • 你说得对,问题不在于 Eclipse,而在于我的代码。三元表达式会引发int 的自动装箱,因此如果keyValueToRowIndex.get(keyValue) 返回null,则会在第3 行抛出NullPointerException。感谢您指出这一点。将0 替换为Integer.valueOf(0) 即可解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 2010-11-08
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
  • 2015-05-22
相关资源
最近更新 更多