代码之家  ›  专栏  ›  技术社区  ›  geert3

Eclipse为可访问代码提供死代码警告(variant)

  •  7
  • geert3  · 技术社区  · 6 年前

    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 仍然可以为空。还是我在这里遗漏了什么?

    我见过类似的月食问题( here 例如),但这个似乎是一个不同的和更琐碎的。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Gyro Gearless    6 年前

    我猜第3行被解释为

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

    (所以?:的两个论点统一为 int )-奇怪的是,Eclipse现在没有显示任何警告,即使现在很明显rowIndex从不为null。。。

    0 具有 Integer.valueOf(0) 使警告消失。

        2
  •  3
  •   isnot2bad    6 年前

    (令人惊讶的)简短回答:

    原因

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

    这个 Java language specification (JLS) 说的是 "Conditional Operator ?" ,即,如果第一个表达式的类型为 int Integer 内景 .

    0 ,这是一个 get 方法,该方法返回类型为 整数 . 所以根据JLS,整个表达式都有基元类型 内景 !

    得到 整数 . 这个 内景 要将它赋给左操作数, rowIndex

    但是如果地图返回 null 价值?在这种情况下,从 NullPointerExpression 会被扔的!

    所以eclipse是对的,因为您的表达式永远不会返回 无效的 , 行索引 无效的 if语句的then块将永远不会执行,因此是死代码!

    解决方案

    解决方法很简单:使用 整数 对象而不是基本体 内景 第一个表达式的值:

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