慕尼黑8549860
2022-07-14 10:13:32
我有一個像這樣的 ConcurrentMaps 的 ConcurrentMap ...ConcurrentMap<String, ConcurrentMap<K, V>> mapsMap = new ConcurrentHashMap<>();現在以某種方法,我想通過確保存在這樣的某個鍵的映射來防止 NPE... mapsMap.putIfAbsent(someKey, new ConcurrentHashMap<K, V>());......所以我可以安全地調用...... mapsMap.get(someKey).put(...);...不用擔心這里的空值。現在,Sonarqube 告訴我,這違反了RSPEC-2201規則......不應忽略來自沒有副作用的函數的返回值 [..] 以及在 ConcurrentMap.putIfAbsent 調用上忽略的返回值。這只是 SonarQube 沒有檢測到該方法的副作用對我來說已經足夠了(并且返回值不會添加任何信息)還是我錯過了關于 putIfAbsent 合約的重要一點?
2 回答

MMMHUHU
TA貢獻1834條經驗 獲得超8個贊
如果指定的鍵尚未與值關聯(或映射到 null),則將其與給定值關聯并返回 null,否則返回當前值。
如果不需要,您可以放心地忽略返回的值。Sonarqube
對于某些規則非常具有侵入性,因此只需禁用它并繼續您的業務。
恕我直言,該特定規則主要是針對由多個開發人員編寫代碼的項目中的常見模式設置的。

拉風的咖菲貓
TA貢獻1995條經驗 獲得超2個贊
除了@LppEdd 的正確分析器之外,這個問題也在sonarqube 論壇上得到了回答:
基本上,這條規則取自 FindBugs 的規則RV_RETURN_VALUE_OF_PUTIFABSENT_IGNORED
putIfAbsent 方法通常用于確保單個值與給定鍵相關聯(如果不存在則放置成功的第一個值)。如果忽略返回值并保留對傳入值的引用,則可能會保留與映射中的鍵不相關的值。如果您使用哪一個很重要,而您使用了未存儲在地圖中的那個,那么您的程序將運行不正確。
在這種情況下,我不保留對存儲值的引用,這確實是誤報。
將來,此特定規則可能會在 SonarQube 中作為單獨的規則實施,而不再作為當前規則 (RSPEC-2201) 的一部分。
添加回答
舉報
0/150
提交
取消