2011-06-28 118 views
4

FindBugs的告訴我,我有以下錯誤:自動裝箱錯誤

A primitive is boxed, and then immediately unboxed. This probably is due to a manual boxing in a place where an unboxed value is required, thus forcing the compiler to immediately undo the work of the boxing.

下面是相關代碼:

... 
String str= "10.0"; 
Double d = (str != null ? Double.valueOf(str) : new Double(0.0)); 
... 

這是什麼意思?我該如何解決呢?

+3

您是否嘗試將此行分割爲多個,從而查看findbugs的哪一部分的確切含義? – ZeissS

回答

5

看起來像FindBugs中的一個bug給我。如果您編譯該代碼,然後在其上運行javap -c,則它永遠不會調用通常用於拆箱的doubleValue()

誠然,你可能想使用緩存Double零,而不是每次就執行一次分配一個,但除此之外,它看起來合理,我...

我建議你將其報告給FindBugs的球隊。

編輯:在向FindBugs團隊報告此問題之前,我會用簡短的​​完整程序更新您的問題,以顯示問題。我向你表達了你向我們展示的代碼是FindBugs所抱怨的代碼。如果不是這樣,所有投注都關閉:)

+0

我以爲否則,但你是對的:因爲條件中的兩個表達式都是'Double'類型,整個條件表達式具有相同的時間:不需要取消裝箱(和重新裝箱)。如果第一個表達式中有'Double.parseDouble(str)',這將會不同。 –

+0

由於FindBugs分析字節碼,也許這是一個編譯器問題? – musiKk

+0

@muisKk:不,因爲如果你看看我的答案,你會發現我也在字節碼上運行了'javap',並且從來沒有見過'doubleValue'用於拆箱。 –

3

我嘗試了你的代碼 - FindBugs不顯示任何錯誤。我認爲這個代碼明顯不同於那個會產生錯誤。

0

您不需要任何自動裝箱或取消裝箱。

double d = str == null ? 0.0 : Double.parseDouble(str); 

的核心是,當你想使用基本不使用對象。

恕我直言它使用正面表達而不是負面和雙面負布爾表達式的混淆。