簡體   English   中英

Eclipse為可訪問代碼(變體)提供死代碼警告

[英]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值,會發生什么? 在這種情況下,從Integerint拆箱是不可能的,並且將拋出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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM