commons lang NumberUtils.createIntegerの使い方

調査中に見かけたコードからいろいろ端折ったもの。

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);
}
}

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.