2011年1月28日 星期五

FindBugs

介紹一個最近由老闆介紹下才知道的 Java 分析工具 FindBugs
因為我自己是用 Eclipse 開發 Java 專案,所以僅記錄安裝 Eclipse IDE 的流程…

於 Eclipse 的 Menu 中選到 Help/Install New Software

Work with 處 Add 一筆 Location 為自己想裝版本的位置,請參考此 下載頁
共有這三種可以任選一種來裝,我自己是裝感覺比較安全的 update site for official releases

update site for official releases:
http://findbugs.cs.umd.edu/eclipse

update site for candidate releases and official releases:
http://findbugs.cs.umd.edu/eclipse-candidate

update site for all releases, including developmental ones:
http://findbugs.cs.umd.edu/eclipse-daily

填好 Location 後,Name就填上自己容易識別的文字…
接著全選、同意、一步步裝下去就行了…

Window/Show View 中找找 FindBugs 再 OK 即可…
如果找不到,也許試試在底下的 other 中找找是否有 FindBugs 資料夾…

我個人是習慣在 Package Explorer View 中針對專案點右鍵、FindBugs
即會開始進行分析的動作,分析完會將找到的問題列在 Bug Explorer View 中
這時再一項一項檢示 FindBugs 給的建議做適當的修正就行嘍,玩了一下,很不賴,
有時會找出一些平常完全不會考慮到的淺在問題,非常棒…

舉個例好了…先前很常使用這類的方式取得絕對值


int nNum = /* 例如亂數好了 */;
arMember[Math.abs(nNum)].getMemberName();


看起來似乎沒什麼問題,但 FindBugs 認為這有問題,
但我們的 nNum 變數要用來做陣列的索引值,那就會造成問題了,
即使這個陣列有整數最大值那麼大,怎麼可能?
難不成將整數轉為絕對值還有可能超出整數最大值?
沒錯,因為 Integer.MIN_VALUE == Math.abs(Integer.MIN_VALUE);
像這種情況要不是 FindBugs 的提醒,小的還真是從來沒想過呢 :P

怎麼決定這個問題呢?加上 And 運算即可解決


arMember[(Math.abs(nNum) & Integer.MAX_VALUE)].getMemberName();


Java 整數範圍是 -2147483648~2147483647
以下用 -128~127 來舉例為何 & 可以解決這個問題


11111111 = -128
&
01111111 = 127
--------------------------
01111111 = 127

1 則留言: