commons lang NumberUtils.createIntegerの使い方
2007/08/10
調査中に見かけたコードからいろいろ端折ったもの。
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.math.NumberUtils; ... public Integer xxx(String str) { if (!StringUtils.isNumeric(str)) { throw new IllegalArgumentException("str isn't number."); } return NumberUtils.createInteger(str); } ...
strが、数値かどうかをチェックして、数値ならIntegerを返却するというメソッドでした。このメソッドには、”090″のような文字列が引数として渡されると、NumberUtils.createIntegerで例外が発生するというバグが入ってました。NumberUtils.createIntegerの仕様は、「16進数、8進数の記号をハンドリングして String を Integer に変換します。」です。(ref javadoc) “080”が、0から始まっているので、”080″を8進数として扱おうとするけど、8進数には現れない8という数字が現れたため例外が発生しているようでした。”070″だと、8進数の70として扱われるので、それはそれで問題。
commons langに任せるという考えかたも良いのですが、ちゃんとメソッドの仕様は知っとかないとですね。という話でした。
どうせなら、下の方が堅いと思います。
public Integer xxx(String str) { try { return new Integer(str); } catch (NumberFormatException e) { throw new IllegalArgumentException("str isn't number.", e); } }