我有以下代码:
public String myMethod(String keyValue) {
Map<String, Integer> keyValueToRowIndex = ...
Integer rowIndex = (keyValue == null) ? 0 : keyValueToRowIndex.get(keyValue);
if (rowIndex == null)
return null;
...
}
Eclipse在返回null时发出“死代码”警告
。删除对
keyValue==null的测试也会删除警告,但我不知道额外的测试如何使return语句变成死代码。显然,如果映射不包含某些非null的
keyValue
条目,则rowIndex
仍然可以为null。还是我在这里遗漏了什么?
我见过类似的Eclipse问题(例如这里),但这一个似乎是不同的,更琐碎的问题。
我猜第3行被解释为
Integer rowIndex = Integer.valueOf((keyValue == null) ? 0 : keyValueToRowIndex.get(keyValue).intValue());
(所以两个参数?:统一为int
)-奇怪的是,Eclipse现在没有显示任何警告,即使现在很明显rowIndex永远不会为空...
您还可以将0
替换为整数。valueOf(0)
使警告消失。
匿名用户
(令人惊讶的)简短回答:Eclipse是正确的!这是死代码!
原因
重要的部分是以下代码行中的三元表达式:
Integer rowIndex = (keyValue == null) ? 0 : keyValueToRowIndex.get(keyValue);
Java语言规范(JLS)提到了“条件运算符”,即,如果第一个表达式的类型为int
,而第二个表达式的类型为Integer
,则整个表达式的类型将为int
。
在您的例子中,第一个表达式是常量文本值0
,它是一个int
。第二个表达式是get
方法的结果,该方法返回类型为Integer
的对象。因此,根据JLS,整个表达式具有基元类型int
!
这意味着,如果第二个表达式(get-调用)将被计算,结果将从整数
到整数
。然后,此int
值将再次自动装箱为整数
,以便能够将其分配给左操作数行索引
。
但是,如果映射返回一个null
值,会发生什么呢?在这种情况下,无法从Integer
到int
取消装箱,将抛出NullPointerExpression
!
因此eclipse是正确的,因为表达式永远不会返回null
,rowIndex
也永远不会是null
,if语句的then块永远不会执行,因此是死代码!
解决方案
解决方案很简单:对于第一个表达式,使用整数
对象而不是原语int
值:
Integer rowIndex = (keyValue == null) ? Integer.valueOf(0) : keyValueToRowIndex.get(keyValue);
问题内容: 我在Eclipse中尝试了以下方法: :警告“死代码” :编译错误“无法访问的代码” 我想知道这种差异是否存在真正的“原因”。我已经找到了… …但是为什么不允许相同的调试目的? 问题答案: 在上可达代码JLS部分解释了理由。本质上,Java通常不应该像C常规那样使用条件编译,但是在某些情况下(例如调试,尤其是向后二进制兼容性),需要允许编译器完全剥离代码,因此特定的结构为此被允许。
我在Eclipse中尝试了以下操作: :警告“死码” while(false){}:编译错误“无法访问代码” 我想知道这种差异是否有真正的“原因”。我已经找到这个。。。 无法访问的代码编译器错误 ...但是为什么不允许用于相同的调试目的呢?
问题内容: 我想知道Java如何处理以下情况: 假设我有一个名为Debug的类,它看起来像这样: 并假设我的代码有一个看起来像这样的调用: 我有几个问题: 如果 isAssertEnabled 标志设置为 false ,是否将整个对Debug.assertTrue的调用编译出来?请注意,仅在调用函数后才检查isAssertEnabled == true。 如果整个调用确实被编译出来了,是否也意味着
编译器提供了 dead_code(死代码,无效代码) lint,这会对未使用的函数产生警告。可以加上属性来抑制这个 lint。 fn used_function() {} // `#[allow(dead_code)]` 属性可以抑制 `dead_code` lint #[allow(dead_code)] fn unused_function() {} fn noisy_unused_funct
问题内容: 我似乎找不到解决此问题的方法。我正在做的是声明一个整数,它告诉我代码不可访问。 问题答案: 一旦使用方法,您将返回到首先调用该方法的方法。返回后放置的任何语句都是没有意义的,因为那是在不严重违反程序计数器的情况下无法到达的代码(在Java中可能是不可能的)。
我知道如何使用Java编码,但我是Neuroph的新手,我用这些代码得到了一个。 Main:https://pastebin.com/dntwrmzn 经理:https://pastebin.com/cswsivvt