[英]Eclipse gives dead code warning for reachable code (variant)
我有以下代碼:
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;
給出了“死代碼”警告return null;
。 刪除keyValue == null
的測試也會刪除警告但我沒有看到額外測試如何使return語句死代碼。 顯然,如果映射不包含某些非null keyValue
條目,則rowIndex
仍然可以為null。 或者我在這里遺漏了什么?
我已經看到了類似的Eclipse問題(例如這里 ),但這個問題似乎是一個不同的,更簡單的問題。
(令人驚訝的)簡短回答: Eclipse是對的! 這是死代碼!
原因
重要的部分是以下代碼行中的三元表達式:
Integer rowIndex = (keyValue == null) ? 0 : keyValueToRowIndex.get(keyValue);
Java語言規范(JLS)談到“條件運算符?” ,如果第一個表達式是int
類型,第二個表達式是Integer
類型,整個表達式的類型將是int
。
在您的情況下,第一個表達式是常量字面值0
,它是一個int
。 第二個表達式是get
方法的結果,它返回一個Integer
類型的對象。 所以根據JLS,整個表達式都有原始類型int
!
這意味着,如果將計算第二個表達式( get
-call),結果將從Integer
取消裝箱到int
。 然后,此int
值將再次自動裝入Integer
,以便能夠將其分配給左操作數rowIndex
。
但是,如果地圖返回null
值,會發生什么? 在這種情況下,從Integer
到int
拆箱是不可能的,並且將拋出NullPointerExpression
!
所以eclipse是對的,因為你的表達式永遠不會返回null
,所以rowIndex
也永遠不會為null
,而if語句的then-block永遠不會執行,因此是死代碼!
解
解決方案很簡單:對第一個表達式使用Integer
對象而不是原始int
值:
Integer rowIndex = (keyValue == null) ? Integer.valueOf(0) : keyValueToRowIndex.get(keyValue);
我的猜測是第3行被解釋為
Integer rowIndex = Integer.valueOf((keyValue == null) ? 0 : keyValueToRowIndex.get(keyValue).intValue());
(所以兩個參數都被統一為int
) - 奇怪的是,Eclipse現在沒有顯示任何警告,即使現在顯然rowIndex永遠不會為空...
您也可以用Integer.valueOf(0)
替換0
以使警告消失。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.